标签:
Handler创建,必须有个一个Looper,主线程自己创建了。其他线程需要自己创建,默认是没有的。创建方法
1. 这种方法是先创建一个系统定义好的HandlerThread,这个是跑在非UI线程中的,已经创建好了looper,直接用就可以了.创建handler有多个构造函数,具体看源码
HandlerThread threadhandler = new HandlerThread("1111");
threadhandler.start();
myhandler = new myHandler(threadhandler.getLooper());
2. 自己创建一个新的线程,在线程中调用Looper.prepare();然后写处理message回调方法,接着还要调用looper.loop();
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
为什么一定要有一个Looper呢?
因为handler的无参数构造函数里需要looper,如果为空就抛异常。
如何设置looper?
调用Looper.prepare();这里会判断当前的线程是不是已经有looper了,有的话会抛异常,这就是说一个线程只能有一个looper。
Message是什么,有什么用?
存放消息的用的,它有很多属性。特别说明target,表示的就是处理它的handler,next属性,这就是利用了链表结构来构造的消息队列,message.next表示着当前消息的下一个,是按照时间来的,只能顺序不能反过来,他没有prev属性。
MessageQueue是什么,有什么用?
用来操作messages,例如handler发送消息过来,他需要把消息按照顺序串起来。还有处理完消息后他需要把消息从消息队列中删除等等。
handler有什么用?
发送和处理消息。handler通过sendmessage等方法发送消息,最终都是通过sendMessageAtTime来处理发送给MessageQueue。然后通过looper回调函数msg.target.dispatchMessage(msg)-->handler的handleMessage()方法具体处理。
handler还可以使用post方法将runnable传给消息队列message有callback属性,在looper的dispatchMessage()方法中,如果是runnable就直接run()了;
最后有个疑问:到底是什么样的机制可以让looper循环去处理message?
while (true) {
Message msg = queue.next(); // might block
if (msg != null) {
if (msg.target == null) {
return;
}
if (me.mLogging!= null) me.mLogging.println( ">>>>> Dispatching to " + msg.target + " "
+ msg.callback + ": " + msg.what );
msg.target.dispatchMessage(msg);
if (me.mLogging!= null) me.mLogging.println( "<<<<< Finished to " + msg.target + " "
+ msg.callback);
msg.recycle();
}
看到Message msg = queue.next(); // might block 这句话,获得待处理的message,这里可能会堵塞,没有message的时候就循环等待,直到messageQueue退出
android-handler、looper、messageQueue、message
标签:
原文地址:http://www.cnblogs.com/liming-saki/p/4515283.html