对handler的一些简单理解

android中的Handler Looper Message MessageQueue相互关系

1.handler用于主线程和子线程之间的相互通讯,通常是new handler,实现handlemessage方法来对message进行处理,而且在初始化handler的方法中必须传入一个Looper,如果在主线程newhandler,那么就共享主线程的looper,存在主线程的threadlocal(线程级共享)中;如果在子线程new handler,那么必须调用looper.prepare方法,然后还得调用looper.loop方法来轮询MessageQueue消息队列,这里又有一个重要的感念:消息队列,他是一个存放handler发送消息的容器,但是,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。默认遵循FIFO(先入先出)规则,也可以指定when属性来自定义message的执行顺序.他是在looper的初始化是创建的.一个线程只能有一个消息队列–为什么?因为一个线程只能有一个Looper啊!消息队列中可以存放多个message,当我们调用Message.obtain()或者Handler.obtainMessage()获取Message对象,先判断消息池中有没有message,如果有就直接返回这个实例,没有则创建一个新的实例,调用removeMessages()时,将Message从MessageQueue中删除,同时放入到消息池中。当looper.loop取出一个消息后,会将这个消息回传给发送消息的handler来处理—-谁发送,谁处理.这是怎么实现的呢?其实内部有一个message.target = this,而这个this其实就是handler.looper.loop内部有一个while(true)死循环,会不停的轮询,当messagequeue中没有消息时,循环会阻塞,不会无限循环下去.
public class LooperThread extends Thread {
@Override
public void run() {
// 将当前线程初始化为Looper线程
Looper.prepare();
// ...其他处理,如实例化handler
// 开始循环处理消息队列
Looper.loop();
}
}

2.接下来,简单的看一下消息的循环过程:
(1)生成
Message msg = mHandler.obtainMessage();
msg.what = what;
msg.sendToTarget();

(2)发送

      MessageQueue queue = mQueue;
        if (queue != null) {
            msg.target = this;
            sent = queue.enqueueMessage(msg, uptimeMillis);
        }

没有写完,有时间再补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值