前言:
关于Android的消息机制,因为涉及的东西太多,网上讲的都深浅不一,我这边结合Android源码和身边的实际应用对其进行总结,不打算一次总结完毕,后面会慢慢完善.
涉及内容: Handler, Looper, Message, MessageQueue,Thread.
Handler
Android提供了一种异步回调机制handler,允许我们在完成很长时间的任务后做出相应的通知.
作用:(结合Sundy的Android讲义)
a.执行预定任务
b.线程之间通信
并不是所有的线程都有looper对象.
Handler是如何与Looper建立联系的?
Handler的构造函数中有这样的代码:
handler.java
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
在新建Handler时需要设置mLooper成员,Looper.myLooper是从当前线程中获取绑定的looper对象:
looper.java
public static final Looper myLooper() {
return (Looper)sThreadLocal.get();
}```
若Looper对象没有创建,就会抛异常"Can't create handler inside thread that has not called Looper.prepare()".
如何将一个普通线程变成loope线程?或者如何在新开的线程中创建handler?
常用的写法:
class MyThread extends Thread {
public void run()
{
Log.d(Constant.TAG, MessageFormat.format("Thread[{0}]-- run...", Thread.currentThread().getName()));
// 其它线程中新建一个handler
Looper.prepare();
// 创建该线程的Looper对象,用于接收消息,
//在非主线程中是没有looper的所以在创建
//handler前一定要使用prepare()创建一个Looper
myThreadHandler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
Log.d(Constant.TAG, MessageFormat.format("Thread[{0}]--myThreadHandler handleMessage run...", Thread.currentThread().getName()));
}
};
Looper.myLooper().loop();//建立一个消息循环,该线程不会退出
}
}```