皮皮网

【adb源码调试】【ys003源码】【营销视频app源码】obtainmessage源码

2024-11-18 23:32:52 来源:厉害 指标源码

1.Android Message和obtainMessage的区别
2.Handler 执行流程及源码解析
3.Handler 的基本使用、常见问题的源码解析以及运行机制源码讲解

obtainmessage源码

Android Message和obtainMessage的区别

       ã€€ã€€å‰å‡ å¤©éœ€è¦å®žçŽ°ä¸€ä¸ªä»¥å¤ªç½‘功能就看了以太网的源码部分,看见了源码部分在消息处理时,发现有一些不同的地方:

       ã€€ã€€

       ã€€ã€€å¹³æ—¶æˆ‘在处理消息时:

       ã€€ã€€

       ã€€ã€€1、首先创建Handler对象:

       ã€€ã€€

       ã€€ã€€private Handler handler = new Handler(){

       ã€€ã€€public void handleMessage(Message msg) {

       ã€€ã€€switch (msg.what) {

       ã€€ã€€case 0:

       ã€€ã€€

       ã€€ã€€break;

       ã€€ã€€

       ã€€ã€€

       ã€€ã€€default:

       ã€€ã€€break;

       ã€€ã€€}

       ã€€ã€€};

       ã€€ã€€};

       ã€€ã€€

       ã€€ã€€2、然后是消息处理:

       ã€€ã€€

       ã€€ã€€private void TestHandlerMessage(){

       ã€€ã€€Message msg = new Message();

       ã€€ã€€msg.what = 1;

       ã€€ã€€handler.sendMessage(msg);

       ã€€ã€€}

       ã€€ã€€

       ã€€ã€€ä½†æ˜¯æˆ‘看别人源码部分是是这样处理的:

       ã€€ã€€

       ã€€ã€€

       ã€€ã€€1、首先创建Handler对象:

       ã€€ã€€

       ã€€ã€€private Handler handler = new Handler(){

       ã€€ã€€public void handleMessage(Message msg) {

       ã€€ã€€switch (msg.what) {

       ã€€ã€€case 0:

       ã€€ã€€

       ã€€ã€€break;

       ã€€ã€€

       ã€€ã€€

       ã€€ã€€default:

       ã€€ã€€break;

       ã€€ã€€}

       ã€€ã€€};

       ã€€ã€€};

       ã€€ã€€

       ã€€ã€€

       ã€€ã€€2、然后是消息处理:

       ã€€ã€€

       ã€€ã€€private void obtainMessageTest(){

       ã€€ã€€Message msg = handler.obtainMessage();

       ã€€ã€€msg.what = 1;

       ã€€ã€€handler.sendMessage(msg);

       ã€€ã€€}

       ã€€ã€€

       ã€€ã€€é€šè¿‡æ¯”较我们会发现,这两种获取Message的实例的方法不一样,于是我看了源码,果然不一样:

       ã€€ã€€

       ã€€ã€€æŸ¥çœ‹obtainMessage()源码:

       ã€€ã€€

       ã€€ã€€å›¾1:

       ã€€ã€€

       ã€€ã€€è¿›å…¥obtain方法:

       ã€€ã€€

       ã€€ã€€å›¾2:

       ã€€ã€€

       ã€€ã€€å†è¿›å…¥objtain方法:

       ã€€ã€€

       ã€€ã€€å›¾3:

       è¿›å…¥Message方法:

        

       å›¾4:

        

        

       æ€»ç»“:

        

       ä¸Šé¢çš„图3中obtain方法的注释中说得很明白:从整个Messge池中返回一个新的Message实例,在许多情况下使用它,因为它能避免分配新的对象

        

       å¦‚果是这人的话,那么通过调用obtainMessage方法获取Message对象就能避免创建对象,从而减少内存的开销了。

Handler 执行流程及源码解析

       本文深入解析了Handler的执行流程及源码,围绕Looper、MessageQueue、Message、Handler之间的adb源码调试协作运行机制,详细介绍了从sendMessage到handlerMessage的代码执行流程。

       在UI线程中,Looper是自动创建的,通过调用Looper.prepareMainLooper()方法,此方法内部调用了Looper的prepare()方法来创建Looper对象,并将其存储在ThreadLocal中,实现线程内部的数据存储。对于子线程,则需手动创建Looper,方法与UI线程一致,同样通过Looper.prepare()完成。

       Handler在初始化时,通过ThreadLocal获取当前线程的Looper与MessageQueue。发送消息时,有三种方式:sendMessage、ys003源码obtainMessage与post(runable),它们实质上操作相同,差异仅在于对Message的处理。最终,所有消息都会通过sendMessage方法调用到MessageQueue的enqueueMessage实现。

       MessageQueue内部使用单链表维护消息列表,主要包含enqueueMessage与next两个操作:enqueueMessage实现数据插入,next通过死循环检查并删除链表中的消息。当MessageQueue中出现新消息时,Looper会立即检测到并处理。营销视频app源码

       Looper的loop()方法内有一个死循环,通过messageQueue.next()检查消息队列,获取并删除新消息。检测到新消息后,调用msg.target.dispatchMessage(msg)处理消息,此方法在Looper内执行,切换到Handler创建时的线程,由Handler发送的消息最终回到Handler内部,执行dispatchMessage(msg)方法。

       Handler处理消息分为三种情况:执行run()方法,youtube在线观看源码实现线程切换;使用Callback接口的实例作为mCallback,用于不使用Handler派生类的情况;重写handlerMessage(msg)方法处理具体业务。至此,从sendMessage到handlerMessage的整个流程得以清晰展现。

       整体流程总结如下:

       1. 在Handler初始化时,获取线程的Looper与MessageQueue;

       2. sendMessage方法最终调用enqueueMessage插入Message到队列,并将Handler赋值给Message对象的target属性;

       3. MessageQueue在插入Message后,Looper检测到新消息,并开始处理;

       4. Looper的loop方法通过traget属性获取到Handler对象,执行dispatchMessage方法;

       5. 最终调用继承自Handler的dcloud双端源码handlerMessage方法处理具体业务。

Handler 的基本使用、常见问题的源码解析以及运行机制源码讲解

       Handler 是Android中处理异步操作的关键组件。它主要有两种使用方式:sendMessage() 和post()。sendMessage() 有三种实现途径,包括创建Handler对象、创建Message对象并发送,以及接收和处理消息。post() 则是通过将Runnable对象放入消息队列,由主线程的Looper处理。

       深入理解Handler,我们需要关注常见问题。比如在主线程和子线程创建Handler的区别:主线程创建时,由于ActivityThread初始化过程自动设置了Looper,而子线程创建则需要手动设置,否则会因无法获取主线程Looper而抛异常。更新UI是否必须在主线程,实际上,子线程可以更新,但必须在requestLayout和invalidate操作之间完成,否则可能导致异常。

       创建Handler的两种方式有差异,方式一使用匿名内部类或接口回调,方式二虽简洁但有警告,不推荐,因为其消息处理是通过Handler的dispatchMessage方法调用接口的handleMessage,而方式一则是直接调用重写的方法。post()方法与sendMessage()的区别在于前者会将Runnable对象封装成Message对象并发送到目标Handler,后者则直接调用目标Handler的dispatchMessage方法。

       创建Message有两种方法,obtain()和obtainMessage()。obtain()会从缓存池获取或创建消息,而obtainMessage()则是传递了Handler对象,可以直接通过message.sendToTarget()发送。不当使用Handler可能导致内存泄漏,通常是由于Handler持有外部类引用,当外部类被销毁时,消息队列中的消息未处理,造成引用循环,从而无法被垃圾回收。

       最后,Handler的运行机制包含四个步骤:初始化主线程Looper和MessageQueue,创建Handler时绑定Looper和队列,发送消息至消息队列,然后由Looper从队列中取出并分发消息,根据不同发送方式调用不同的处理方法。深入研究Handler,有助于更高效地管理Android应用的异步任务和UI更新。