当前位置: > 科技>正文

androidhandler循环(android handlerthread机制)

2024-08-27 13:41:08 互联网 科技

本篇目录:

1、Android-Handle(线程间通信)详解2、Android在子线程用handler发送的消息,主线程是怎么loop到的3、Android-Handler同步屏障4、Android消息队列浅析

Android-Handle(线程间通信)详解

线程间通信是在Android开发中比较经常遇到的,我们刷新UI界面一般是通过子线程做完某些事情后,要改变主页面就要通过数据的通信,让主线程接收到信息后自己改变UI界面。

Android的handler机制的原理分为异步通信准备,消息发送,消息循环,消息处理。异步通信准备 在主线程中创建处理器对象(Looper)、 消息队列对象(Message Queue)和Handler对象。

androidhandler循环(android handlerthread机制)  第1张

Handler是Android消息机制的上层接口。通过它可以轻松地将一个任务切换到Handler所在的线程中去执行。通常情况下,Handler的使用场景就是 更新UI 。在子线程中,进行耗时操作,执行完操作后,发送消息,通知主线程更新UI。

线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。Handler创建消息 每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能。Android消息机制中引入了消息池。

Handler对象在进行初始化的时候,会默认的自动绑定消息队列。利用类post方法,可以将Runnable对象发送到消息队列中,按照队列的机制按顺序执行不同的Runnable对象中的run方法。

Android在子线程用handler发送的消息,主线程是怎么loop到的

1、我们可以看到 mLooper=looper.myLooper(); 这是获取当前线程的looper实例,也就是主线程的looper。所以当发送消息的时候主线程就可以获取到消息。

androidhandler循环(android handlerthread机制)  第2张

2、在主线程里默认包含了一个消息队列不需要手动创建。在子线程里,使用Looper.prepare()方法后,会先检查子线程是否已有一个looper对象,如果有则无法创建,因为每个线程只能拥有一个消息队列。

3、Handler是Android消息机制的上层接口。通过它可以轻松地将一个任务切换到Handler所在的线程中去执行。通常情况下,Handler的使用场景就是 更新UI 。在子线程中,进行耗时操作,执行完操作后,发送消息,通知主线程更新UI。

Android-Handler同步屏障

就需要先移除这个同步屏障,即调用MessageQueue#removeSyncBarrier()同步屏障一般在日常开发中比较少用,而在系统源码中就有使用。Android系统中的UI更新相关的消息即为异步消息,需要优先处理。

开启同步屏障是通过MessageQueue.postSyncBarrier():这里构造了一个Message,并且没有指定msg.target,最后将这个Message插入表头。这个Message就构成了一个内存屏障。再看它是如何构成内存屏障的。

androidhandler循环(android handlerthread机制)  第3张

Handler 是Android SDK中用来处理异步消息的核心类,子线程可以通过handler来通知主线程进行ui更新。

内部类持有外部类的对象,handler持有activity的对象,当页面activity关闭时,handler还在发送消息,handler持有activity的对象,导致handler不能及时被回收,所以造成内存泄漏。

另外,Android 在 1 还对 Handler 机制进行了略微改造,使之支持 Asynchronous Message(异步消息) 和 Synchronization Barrier(同步屏障)。一般情况下同步消息和异步消息的处理方式并没有什么区别,只有在设置了 同步屏障 时才会出现差异。

在 scheduleTraversals 首先中执行同步屏障,其次再将任务 postCallback 给 Choreographer,Choreographer 将任务保存在 mCallbackQueues 中,同时发送 MSG_DO_SCHEDULE_CALLBACK 的同步消息给FrameHandler。

Android消息队列浅析

1、Message是消息对列的消息实体类,因为消息队列中会存放最多10个Message对象。常用属性what,是消息体的Tag,用来区分是那个一消息体。

2、Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。Message Queue(消息队列):用来存放线程放入的消息。

3、UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue,系统的主线程在ActivityThread的main()为入口开启主线程,其中定义了一系列消息类型,包含四大组件的启动停止。

4、若设置为true,mqtt服务器会保留每次发布的消息;较少提到 若订阅某主题的客户端重启,则会把此主题之前发布的消息重新推送到客户端。

到此,以上就是小编对于android handlerthread机制的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位老师在评论区讨论,给我留言。

消息

版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本站联系的,一经查实,本站将立刻删除。