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

摘要:
通过获取主线程的looper对象,就可以在子线程的handler中提交更新界面的代码了。

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

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

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

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

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

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

2. handler源代码分析

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

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

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

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

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

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

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

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

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

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

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

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

免责声明:文章转载自《android 在子线程中使用handler更新界面》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇吉特仓库管理系统- 斑马打印机 ZPL语言的腐朽和神奇HTML5 getUserMedia/AudioContext 打造音谱图形化下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JAX-WS HandlerChain使用详解

JAX-WS的Handler和Servlet的Filter相似,可以对所有WebServicer进行拦截,在Handler中可以记录日志、权限控制、对请求的SOAP消息进行加密,解密等。JAX-WS提供两个Handler接口,LogicalHandler和SOAPHandler。LogicalHandler处理的是Message Payload,只能够访...

iOS-消息循环RunLoop详解

RunLoop,跑圈。在iOS开发中,也就是运行循环。 在应用需要的时候自己跑起来运行,在用户没有操作的时候就停下来休息。充分节省CPU资源,提高程序性能。 二. RunLoop的概念与作用 概念:一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。但是有时候我们需要线程能够一直“待命”随时处理事件而不退出,这就需要一个机制来完成这样的...

Semaphore 与ThreadPoolExecutor 的使用

1、 Semaphore 信号量  (阻塞) 优点:可以控制线程的数量,不会超出线程范围 缺点:当线程死锁时,永远没法释放,导致一直阻塞 在java中,提供了信号量Semaphore的支持。 Semaphore类是一个计数信号量,必须由获取它的线程释放, 通常用于限制可以访问某些资源(物理或逻辑的)线程数目。 一个信号量有且仅有3种操作,且它们全部是原子的...

java笔试题

1,有关线程的哪些叙述是对的()A,一旦一个线程被创建,它就立即开始运行。B,使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行。C,当一个线程因为抢先机制而停止运行,它被放在可运行队列的前面。D,一个线程可能因为不同的原因停止并进入就绪状态。答案:BCD在抢占式线程模型中,操作系统可以在任何时候打断线程。通常会在它运行了一段时间(...

VC++ 定时器使用总结

VC++    WM_TIMER   定时器使用方法       在编程时,会经常使用到定时器。使用定时器的方法比较简单,通常告诉Windows一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。   1.1 用WM_TIMER来设置定时器   先请看SetTimer这个A...

RabbitMQ消息可靠性传输

消息的可靠性投递是使用消息中间件不可避免的问题,不管是使用kafka、rocketMQ或者rabbitMQ,那么在RabbitMQ中如何保证消息的可靠性投递呢? 先再看一下RabbitMQ消息传递的流程图: 从上面的图可以看到,消息的投递有三个对象参与: 生产者 RabbitMQ(broker) 消费者 那么消息的可靠性传输也主要是针对以上三个对象来...