您的位置:首页 > 运维架构

异步消息处理机制 Handler Looper Message

2016-03-17 19:25 267 查看
说明: 异步消息处理机制是由于在UI线程不能发生阻塞,所以把耗费时间的操作放到子线程处理,但是处理完成后,需要主线程进行相关操作(更新UI),所以有了异步消息处理机制,android三种实现异步消息处理机制最后都是由 Handler Looper Message这个组合处理(MessageQueue这个再Looper类初始化)。

首先列出三种异步消息处理的代码

定义一个Handler,在onCreate()方法内或者局部变量都可以

Handler handler = new Handler(){
@Override       <span style="color:#ff0000;">  //handler异步消息处理回调方法</span>
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};


1、handler post(Runnable r)

new Thread(new Runnable() {
@Override
public void run() {

handler.post(new Runnable() {
@Override
public void run() {
<span style="color:#ff0000;">//在UI线程运行的代码</span>
}
});
}
}
).start();
2、 runOnuiThread

new Thread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
//<span style="color: rgb(255, 0, 0); font-family: Arial, Helvetica, sans-serif;">在UI线程运行的代码</span>
}
});
}
}
).start();
3、handler发送消息

new Thread(new Runnable() {
@Override
public void run() {
Message message = handler.obtainMessage();
handler.sendEmptyMessage(0);  <span style="color:#ff0000;">//发送消息后,在回调函数handlerMessage()方法内调用</span>
}
}
).start();


备注:上面三个方法最后都是通过handler处理异步信息

Handler Looper Message 机制主要内容如下:
1、每个线程有且最多有一个Looper对象,主线程启动默认初始化Looper对象(ActivityThread)
2、loop()方法,不断从MessageQueue中去取消息,交给消息的target属性的dispatchMessage去处理
3、子线程如果new 一个handler,需要初始化Looper(Looper.prepare()),并且后面执行(Looper.loop),handler初始化 时会判断是否有Looper对象,如果为空,则抛出异常
4、Looper.prepare()方法内有判断Looper对象是否为空,如果不为null,则抛出异常 Looper对象存储在ThreadLoacal对象内
备注:ThreadLocal和synchronized都是同步代码,ThreadLocal可以在一个线程中存储变量
5、Handler的构造方法,会首先得到当前线程中保存的Looper实例,进而与Looper实例中的MessageQueue想关联。
6、hanlder内的handlerMessage()是回调函数

建议根据源代码分析查看对应的关系
两个文章结合看:http://blog.csdn.net/lmj623565791/article/details/38377229 http://blog.csdn.net/guolin_blog/article/details/9991569
子线程定义异步处理
new Thread(new Runnable() {
private Handler handler;
@Override
public void run() {
Log.e("xiaoma", "aabbbbbaaaa");
Looper.prepare();
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);

Log.e("xiaoma","aaaaaaaaaaa");
}
};
handler.sendEmptyMessage(0);
Looper.loop();

}
}
).start();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: