从源码了解handler looper ,messageQueue思路
一:首先,一个最简单的发送和回调demo
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
MyHandler myHandler = new MyHandler();
myHandler.sendEmptyMessage(0);
Looper.loop();
}
}).start();
从demo看只有简单的三步:
1.Looper.prepare();//此部分的作用是创建looper,并初始化一个消息队列messageQueue
源码如下:
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}
private Looper(boolean quitAllowed) {
mQueue = new MessageQueue(quitAllowed);
mThread = Thread.currentThread();
}
2.初始化handler ,然后hander.sendMessage();//将消息放入消息队列中
3.Looper.loop();//无限循环的去消息队列中找是否有massage ,如果有回调出来
二.从这三步来分析源码思路
1.
2.
3.
主要的流程完结,最后有个问题,为什么在一般项目中好像没有用到Looper.prepare()和Looper.loop();那是因为我们在UI线程中new Handler,系统在activityThread中帮我们加上了这二句,所以如果你自己创建一个线程,并在这个线程中new Handler(),就要自己加上这二句,否则会报错哦。
