从源码了解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(),就要自己加上这二句,否则会报错哦。