美文网首页
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