本文主要讲解“安卓消息机制Handler有哪些用法”。本文的解释简单明了,易学易懂。请跟随边肖的思路,一起学习学习《安卓消息机制Handler有哪些用法》!
1.简述
处理程序消息机制主要包括:MessageQueue、Handler、Looper和Message。
消息:要传递的消息,可以传递数据;
MessageQueue:消息队列,但它的内部实现不是使用的队列,而是单链表的数据结构来维护消息列表,因为单链表在插入和删除方面都有优势。主要功能是向消息池(MessageQueue.enqueueMessage)发布消息,并从消息池(MessageQueue.next)获取消息。
Handler:消息辅助类,主要功能是将各种消息事件(handler . sendmail)发送到消息池,并处理相应的消息事件(handler . handler message);
Looper:消息控制器,它连续循环(Looper.loop),从MessageQueue中读取消息,并根据分发机制将消息分发到目标处理器。
2.异步线程切换原理
classLooperThreadextendsThread {
publicHandlermHandler
public void run(){ 0
looper . prepare();
mhhandler=new handler(){ 0
public void handlemessage(Messagemsg){ 0
//processincomingsmessageshere
}
};
looper . loop();
}
}每个异步线程维护一个唯一的Looper。每个循环程序将初始化(维护)一个消息队列,然后进入一个无限循环来读取存储在消息队列中的消息。如果没有消息,它将阻塞并等待。
在实例化Handler的过程中,我们将首先获取当前线程的looper对象,然后获取Looper对象对应的MessageQueue。请注意,源处理程序保存循环程序和消息队列。
privatedstativychandlecallback(Messagemessage){ 0
message .回调. run();
}
finalLoopermLooper
finalMessageQueuemQueue
finallycallbackmcallback;当我们发送一条消息时,即handler.sendMessage或
handler.post,会将msg中的target赋值为handler自身,这就是实现message从一个线程到另外一个线程的传递的本质,之后加入到消息队列中。
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target = this; if (mAsynchronous) { msg.setAsynchronous(true); } return queue.enqueueMessage(msg, uptimeMillis); }
我们一般会重写handlerMessage方法处理消息,这将会在msg.target.disPatchMessage方法中被回调,从而实现了message从一个线程到另外一个线程的传递。
3.总结
-
1.Handler 的背后有 Looper、MessageQueue 支撑,Looper 负责消息分发,MessageQueue 负责消息管理;
-
2.在创建 Handler 之前一定需要先创建 Looper,Looper 有退出的功能,但是主线程的 Looper 不允许退出;
-
3.异步线程Looper,Looper.prepare()创建Looper,Looper.loop()开始轮询,需要自己调用 Looper.myLooper().quit()退出;
-
4.Runnable 被封装进了 Message,可以说是一个特殊的 Message;
-
5.Handler.handleMessage() 所在的线程是 Looper.loop() 方法被调用的线程;
-
6.Handler内存泄漏的原因
原因:MessageQueue持有Message,Message持有activity,delay多久,message就会持有activity多久。
解决方案:静态内部类、弱引用,最后不要忘记调用Handler.removeCallbacksAndMessages(null)清空所有消息。
public class SampleActivity extends Activity { /** * Instances of static inner classes do not hold an implicit * reference to their outer class. */ private static class MyHandler extends Handler { private final WeakReference<SampleActivity> mActivity; public MyHandler(SampleActivity activity) { mActivity = new WeakReference<SampleActivity>(activity); } @Override public void handleMessage(Message msg) { SampleActivity activity = mActivity.get(); if (activity != null) { // ... } } } // MyHandler private final MyHandler mHandler = new MyHandler(this); /** * Instances of anonymous classes do not hold an implicit * reference to their outer class when they are "static". */ private static final Runnable sRunnable = new Runnable() { @Override public void run() { /* ... */ } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Post a message and delay its execution for 10 minutes. mHandler.postDelayed(sRunnable, 1000 * 60 * 10); // Go back to the previous Activity. finish(); } @Override protected void onDestroy() { super.onDestroy(); //mHandler.removeCallbacksAndMessages(null); } }
感谢各位的阅读,以上就是“Android消息机制Handler用法有哪些”的内容了,经过本文的学习后,相信大家对Android消息机制Handler用法有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/126257.html