Handler 和 Looper的爱恨情仇

Handler机制是为了更新UI以及消息处理。

不能在非UI线程中更新UI。


Android提供了Handler 和 Looper 来满足线程之间的通信。


Handler满足先进先出原则。

Looper类用来管理特定线程内对象之间的消息交换。


Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里,或者就收Looper从MessageQueue取出消息。
MessageQueue:用于存放线程放入的消息。
handler负责发送消息,Looper负责接收Handler发送的消息,并直接把消息回传给handler自己,MessageQueue就是一个存储消息的容器。

创建大体思路:

1、首先在一个线程中Loop.prepare()方法会在本线程中创建一个Looper实例,然后该实例又会创建一个MessageQueue对象。Looper.perpare()在一个线程中只会调用一次,因此一个线程中只有一个Looper实例和一个MessageQueue。


2、Looper.loop()会让当前线程进入一个无限循环,不断从MessageQueue的实例中读取消息,然后回调msg.target.dispatchMessage(msg)方法。


3、Handler的构造方法,会首先得到线程的保存的Looper实例,进而与MessageQueue相关联。


4、Handler的SendMessage方法,会给msg的target赋值为handler自己,然后加入到MessageQueue中。


5、在构造Handler实例时,会重写handlerMessage方法,就是msg.target.dispatchMessage(msg)方法。


handler.sendMessage()-->发送消息给指定handler(自己)
handler.obtainMessage()-->消息发送给自己handler,池中有handler对象取出使用,没有就创建

message.sendToTarget()-->其中Target的目标就是handler自己


handler.removeCallbacks(runnalbe); 将此Handler在线程中移除


new Callback() -->可以拦截消息;


HandlerThread类可以方便的在Handler中实现子线程的操作。


其他:
Android中更新UI的几种方式:
  • runOnUIThread

  • handler post

  • handler sendMessage

  • view post

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值