Android 中关于ThreadHandler的使用与探索

ThreadHandler的使用:

  ThreadHandler的使用是需要和Handler配合使用的


首先创建ThreadHandler,并启动它。


然后创建一个类实现Handler.Callback接口,重写handleMessage方法来对接收到的message消息进行处理。


然后将ThreadHandler中的Looper对象和Handler.Callback的实现类的对象作为参数传入Handler的构造函数生成Handler的对象。


然后我们就可以用chiledThread发送message了,由于ThreadHandler是子线程,所以发送的message都是在子线程中处理。


ThreadHandler的探索:

在Android中要想更好的了解一样东西,没有什么比去探索源码更好的了。现在我们来查看ThreadHandler的源码:


ThreadHandler继承自Thread,这是标准的创建子线程的套路,接着我们看它在run()函数中有干了什么坏事?


在58行调用了Loper的静态函数prepare(),点进去瞅瞅,



发现这个函数的目的是先判断所在当前线程中是否已经存在了Looper实例了,如果存在侧抛出异常(从这里可以看出每个线程只有一个Looper实例),如果没有则创建并存起来,而在创建Looper实例时同时实例化了一个MessageQueue对象和指定了Looper所在的线程。

在接着看ThreadHandler中run()函数中初始化了Looper后,为了线程安全使用了synchronized关键字加锁获取Looper对象存到一个全局变量当中,然后执行了Looper.loop()方法。


我们可以看到在141行使用了一个for(;;);通过这个循环不断的从MessageQuene中读取消息,获得消息体之后通过上图中标记的地方调用Handler(msg.taret是一个Handler)的dispatChMessage()函数



通过Handler的dispatchMessage()将Message发给Handler.Callback的handleMessage()处理,这就是handler接受消息的流程:

在线程中Looper.prepare()初始化Looper得到Looper实例和一个MessageQueue实例,然后再通过Loop.loop()开启循环读取MessageQueue中的Message,然后把Message发送到Handler中处理。


Handler通过以上方法绑定Looper和Handler.Callback。


Handler将Message存入MessageQueue中,然后供Loop.loop()循环读取。

以上就是handler的运行流程:

附上GitHub地址:https://github.com/tiansuozhanyue/ThreadHandlerTest

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值