android-handler-3

关于 Handler、Looper、MessageQueue,我想大家都了解的差不多了,简单来说就是一个 Handler 对应一个 Looper,一个 Looper 对应一个 Message。那么再想个问题,一个 Handler 可以对应多个 Looper 吗? 一个 Looper 可以对应多个 Handler 吗?

之所以会提出上面这个问题,主要是因为在看 Looper 的源码时,发现了其中的 getMainLooper 这个方法,从名字可以看出是获取主线程的 Looper,那么为什么要特别提供这个方法呢?首先看一下这个方法的源码,很简单:

同时不一定非要去更新ui之类的,可以是只是线程间去传递消息

 
  1. /*

  2. * 返回应用主线程中的 Looper

  3. */

  4. public static Looper getMainLooper() {

  5. synchronized (Looper.class) {

  6. return sMainLooper;

  7. }

  8. }

其实我们平时最常用的是无构造参数的 Handler,其实 Handler 还有构造参数的构造方法,如下:

 
  1. public Handler(Looper looper, Callback callback, boolean async) {

  2. mLooper = looper;

  3. mQueue = looper.mQueue;

  4. mCallback = callback;

  5. mAsynchronous = async;

  6. }

在此注意构造函数中第一个参数是 Looper 就可以了,那么也就是说,我们可以传递一个已有的 Looper 来创建 Handler。这里先不写示例代码了,填个坑,以后有时间再写,大概是下面这样:

 
  1. Handler handler = new Handler(Looper.getMainLooper()){

  2. @Override

  3. public void handleMessage(Message msg) {

  4. super.handleMessage(msg);

  5. }

  6. };

注意上面的 Looper.getMainLooper(),将主线程中的 Looper 扔进去了,也就是说 handleMessage 会运行在主线程中,那么这样有什么用呢?这样可以在主线程中更新 UI 而不用把 Handler 定义在主线程中。这里丢的是主线程的looper,参考handler-2的HandlerThread,把mHandlerThread的loop丢进去,就是在子线程中运行了。

同时可以把不同的工具类加到looper,

当然刚才提到的作用只是对应于主线程中的 sMainLooper 了,其实各种 Looper 都可以往 Handler 的构造方法这里扔,从而使得 handleMessage 运行在你想要的线程中,进而实现线程间通信。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值