首页 > 编程知识 正文

handler机制的原理,HANDER

时间:2023-05-03 19:04:51 阅读:178772 作者:2270

Hander机制什么是Handler? Handler主要用于异步消息处理,像辅助类一样,它封装消息传递处理的接口,通常用于处理耗时的操作

2.Handler原理: Handler有四个重要的对象。

Looper的内部包含消息队列。 这意味着消息队列中的所有handler发送的消息都将进入此消息队列

Looper的loop方法是一个死循环,继续从消息队列中获取消息。 如果有消息,则处理消息,如果没有消息,则处于阻塞状态

Meassagequeue是可以添加和处理消息的消息队列

当我们在主线程new的Handler上时,我们可以使用主线程Handler将其与我们的looper和消息队列相关联。 在我们得到数据后,我们可以使用handlersendmesssage方法在一个名为looper的循环中得到我们的数据

Activity的生命周期也依赖于handler的消息机制进行回调,是因为在我们的ActivityThread中handler依赖于what的完整分数进行不同的回调方法,不同的Activity生命周期handler主要用于异步消息处理,Android为更新UI提供了一组机制。 可以通过handler发送消息,也可以接受和处理消息。

异步消息处理: android在设计时对这些机制进行了子集设置,以便可以通过handler发送消息,以及接收和处理消息

如果不遵循此机制就无法更新UI,则会抛出异常。 为什么要用handler结构跟随新的UI呢,是因为假设activity中有多个线程更新UI,如果没有锁定机构则会产生页面混乱,给UI操作加上枷锁会降低性能,所以使用handler将信息处理的优先顺序

Handler在主线程内(UI线程内)运行,由于被设计为子线程可以通过消息对象传递数据,此时,Handler负责从子线程接收信息,子线程消息中包含int、object型的信息。 尽量使用Message.what识别信息,采用不同的方法处理Message;

执行过程:子线程通过sendmessage发送消息,该消息放入消息队列

队列以先进先出的方式被Looper提取,Looper提取信息,传递给主线程的handler,handler通过handleMessage处理信息,然后更新ui。

handler主要是

消息(包括消息、消息ID、消息处理对象、要处理的数据等的消息由消息队列统一对齐,并最终由处理程序处理。

Handler :处理者,负责消息的发送和处理。 如果使用Handler,则必须实现handle message (msg )方法来处理特定的消息,例如更新UI。

Handler类的主要作用:(有两个主要作用)1)、通过工作线程发送消息; 2 )通过主线程获取和处理消息。

消息队列:用于存储从handler发送的消息的消息队列

按照FIFO规则执行。 当然,保存Message不是实际意义的保存,而是将Message连接起来的,等待Looper的提取。

Looper :消息泵,从消息队列中提取消息并继续执行。 因此,消息队列需要查找器。 缺省线程没有消息吉鲁类型。 必须通过调用Looper.prepare来创建消息吉鲁组。

调用Looper.loop使消息吉鲁发挥作用。 调用loop方法后,将启动循环,并从消息队列中提取消息。 接下来,handler发送的消息将由handler的handle消息处理。 处理完成后,调用Message.recycle将其放入Message pool中。

Thread :调度整个消息吉鲁组或消息吉鲁执行位置的线程。

handler导致内存泄漏的原因及解决方案

如果用户在网络请求期间关闭了Activity,则通常将不再使用该Activity,并且在通过onDestory ()方法执行GC检查时应该会回收它。

但是,由于此时线程尚未运行,因此该线程具有对Handler的引用。 否则,怎么给Handler发消息? 请参阅。

由于该Handler还具有Activity引用,因此无法回收该Activity,在网络请求结束之前会发生内存泄漏。

如果执行Handler的postDelayed ()方法,则此方法会将Handler读入消息并将此消息推入消息队列,以便在设置的delay到达之前

有消息队列-消息处理程序-活动的链,您的活动无法回收。

解析:静态内部类,静态内部类当前不被该类引用。 它还使用弱引用在gc触发时回收handler中的activity。

关闭Activity时停止后台线程。 线程停止了,意味着Handler与外部的连接线被切断了,Activity自然会在适当的时候被回收。

如果您的Handler引用了delay的消息,则只需使用相应的handler remove callbacks ()方法从消息队列中删除消息对象即可。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。