Android异步消息处理和应用
程序员文章站
2022-05-14 17:57:31
...
介绍Handler, Looper, MessageQueue, Message之间的关系
ref:
一.Handler, Looper, MessageQueue各自的主要功能以及之间的关系
三者之间的关联
三者之间的运转流程:
Thread/Runnable:
应用一般将消息处理放在非阻塞的线程里面
通过Handler来接收handle message
Handler:
1.提供消息接口
发送消息存储到消息队列mQueue: sendMessage
获取消息对象空间并赋值:obtainMessage
消息回调接口:dispatchMessage 最终是调用消息handleMessage来处理消息,但实际一般由父类重写的handleMessage来处理.
2.关联MessageQueue
3.获取looper
Looper:
1.每个线程只能创建一个looper
2.looper最好不要放在主线程中或者容易阻塞的接口或模块里面
3.每个线程中Looper.prepare ->Looper.loop最好只调用一次,否则会抛异常.
Looper主要包含
(1)消息队列MessageQueue , 与Handler的mQueue进行关联
(2)loop循环分发消息,调用Message.target.dispatchMessage(msg);
其中第2点,举个例子:
android.media;
public class MediaPlayer ...
{
private EventHandler mEventHandler;
private Looper mSavelogLooper = null;
public MediaPlayer() {
Looper looper;
if ((looper = Looper.myLooper()) != null) {
mEventHandler = new EventHandler(this, looper); //使用主线程的looper [可能来activity之类的主线程的looper]
===>From: Activity->ActivityThread->Looper.prepareMainLooper()
}
}
public native void prepare();
public class SaveLogThread extends Thread { //子线程单独创建一个Looper并启动loop.
public Handler mHandler;
public SaveLogThread(){
super();
}
public void run() {
Looper.prepare();
mSavelogLooper = Looper.myLooper();
mHandler = new Handler() {
public voidhandleMessage(Message msg) {
...
});
Looper.loop();
}
但调用prepare阻塞时,主线程受阻, 底层通过mEventHandler 发送消息的时候,主线程的looper就无法发送和处理消息了.
MessageQueue:
管理消息Message,增加,删除.
上一篇: 面试 - handle使用及原理(1)
推荐阅读
-
android之视频播放系统VideoView和自定义VideoView控件的应用
-
Android中应用界面主题Theme使用方法和页面定时跳转应用
-
Android下载进度监听和通知的处理详解
-
Android中父View和子view的点击事件处理问题探讨
-
Android 异步获取网络图片并处理导致内存溢出问题解决方法
-
Android多线程及异步处理问题详细探讨
-
PHP PDO和消息队列的个人理解与应用实例分析
-
android的消息处理机制(图文+源码分析)—Looper/Handler/Message
-
Android Handler主线程和一般线程通信的应用分析
-
android隐式意图激活自定义界面和系统应用界面的实例