美文网首页
handler的使用注意点

handler的使用注意点

作者: 梧叶已秋声 | 来源:发表于2020-01-18 10:05 被阅读0次

当在一个非activity或thread类中创建handle的时候,例如Call中。因为传入Handler的需要是主线程的looper。
如果你不带参数的实例化:Handler handler = new Handler();那么这个会默认用当前线程的looper。

  class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };

          Looper.loop();
      }
  }

一个looper对应一个handler。


image.png

由于无法保证Call 的当前运行线程的looper是否为主线程(call的使用场景有2种,打电话和接电话,接电话的时候,调用call的线程不是主线程),所以在源码中call的handler的创建传入的是Looper.getMainLooper()。

package com.android.server.telecom;
public class Call implements CreateConnectionResponse, EventManager.Loggable {
    private final Handler mHandler = new Handler(Looper.getMainLooper());
}

但是如果非要创建一个不带looper参数的Handler,并且不方便加Looper的话,就要在创建之前加上判断条件,确保只有当前线程是主线程的时候才创建该handler。

Handler handler;
if (Looper.myLooper() == Looper.getMainLooper()) {
   handler  = new Handler();
}

参考链接:
Looper.getMainLooper()
Handler一定要在主线程实例化吗?new Handler()和new Handler(Looper.getMainLooper())的区别

Android判断当前线程是否是主线程的方法

相关文章

网友评论

      本文标题:handler的使用注意点

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