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

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


代码

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android消息处理机制估计都被写烂了,但是依然还是要写一下,因为Android应用程序是通过消息来驱动的,An...
    一码立程阅读 9,952评论 4 36
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,789评论 25 709
  • 1. ANR异常 Application No Response:应用程序无响应。在主线程中,是不允许执行耗时的操...
    JackChen1024阅读 5,323评论 0 3
  • 异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的消息...
    cxm11阅读 11,501评论 2 39
  • 今天和朋友潘多拉一起吃中午饭,跟她聊聊天,学学她对生活的态度和热情。 她告诉我没有比较就没有差距,她说有一段时间,...
    狒狒妞阅读 1,222评论 0 1