美文网首页
每个线程只有一个loop线程的理解

每个线程只有一个loop线程的理解

作者: Jsonjia | 来源:发表于2016-04-29 15:38 被阅读1553次

    眼看四月底了,然后今天也是五一小长假的前一天,我想大家都坐不住了吧。出去玩的出去玩,回家的回家,然而总有一批任劳任怨的工程师奋战在一线,哈哈,我就是其中的一位~


    代码

    /** 
      * 显示吐司
      */
     public static void showToast(Context context , String str){
           boolean canLooper = true;
           Looper.prepare();
           if(context != null)
              Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
           else
              Toast.makeText(ZjpTopLanApplication.getInstance(),str,Toast.LENGTH_SHORT).show();
           if(canLooper)
              Looper.loop();
      }
    

    然后我们调用这个方法,会报如下错误:

    error图.png

    意思就是说,每个线程中只有一个Looper。
    我们都知道,只有主线程(即UI线程)可以直接调用Handler,因为主线程是有looper的,其他线程中调用,必须初始化looper。上面代码中我们虽然初始化了looper,但是始终是一个线程,每次线程走里面这个方法会走一步looper,然而,如果looper已经存在了,还走这个方法,会再次初始化looper,就造成如上图异常了,具体解决方案,如下:

    /** 
      * 显示吐司
      */
      public static void showToast(Context context, String str){
             try {
                  boolean canLooper = true;
                  try{
                      Looper.prepare();
                  }catch (Exception e) {
                      canLooper = false;
                  }
                  if(context != null)
                     Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
                  else
                     Toast.makeText(ZjpTopLanApplication.getInstance(),str,Toast.LENGTH_SHORT).show();
                 if (canLooper) {    
                     Looper.loop();
                 }
             }
      }
    

    这样就保证了一个线程就只有一个looper了,因为如果执行一遍线程运行 Looper.prepare() 后,线程中有looper了,再次执行这个方法,直接会抛异常,这样canLooper就会为false了,接下来往下走就不会执行Looper.loop()了,好了,大功告成!
    祝大家五一嗨皮~

    相关文章

      网友评论

          本文标题:每个线程只有一个loop线程的理解

          本文链接:https://www.haomeiwen.com/subject/sgzhrttx.html