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

2016-04-29  本文已影响1553人  Jsonjia

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


代码

/** 
  * 显示吐司
  */
 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()了,好了,大功告成!
祝大家五一嗨皮~

上一篇下一篇

猜你喜欢

热点阅读