android 在子线程中使用handler更新界面

1. 在子线程中创建一个handler对象,让这个handler对象获取主线程的looper,这样才能把这个handler中的消息发送到ui线程的消息队列中

下面这个界面当点击updateui按钮就会创建一个对象然后调用它的更新图片和文字的方法,这两个设置方法在子线程中执行。

在更新界面的对象的类中创建一个handler对象,在初始化的时候给他赋值为Looper.getMainLooper,这样这个handler分发的消息就会被分发到主线程的队列中并且被执行,所以就能在这个子线程中进行更新界面了,如果在updateui0这个方法中不适用mhandler来提交更新的话就会发生下面的错误

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

 2. handler源代码分析

首先是创建handler对象的时候我们传入了ui线程的looper到这个子线程的handler中。可以看到looper被赋值给了handler对象中的mLooper,并且由于我们只是用了带looper参数的构造器,所以这里的callbak是为null

2.在handler的post方法中通过getMessage方法获取一个msg对象,这个对象初始化就带有了post提交的那个runnable对象,这样这个msg就持有了我们要提交到ui线程进行更新的runnable对象了

 3. post继续回调用到sendMessageAtTime方法,这个方法会创建一个消息队列,这个消息队列就是我们在handler创建时传递进去的looper所携带的消息队列(这里是ui线程的消息队列),这里的mQueue是在handler中获取的looper的queue

然后将mQueue赋值一下再传递到enqueueMessage中去,这个传递的messagequeue其实是来自ui线程的

4. 把消息队列和消息都传递到了enqueueMessage方法中,这个方法就会调用这个handler中的消息队列对象,通过消息队列对象的enqueueMessage方法会循环取出消息队列中的消息进行处理

 

 综上所述,通过handler和looper旧可以进行线程间的通信。通过获取主线程的looper对象,就可以在子线程的handler中提交更新界面的代码了。

 

转载于:https://www.cnblogs.com/xxss0903/p/5959046.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值