从源码了解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.从源码了解handler looper ,messageQueue思路_第1张图片


2.从源码了解handler looper ,messageQueue思路_第2张图片

3.从源码了解handler looper ,messageQueue思路_第3张图片


主要的流程完结,最后有个问题,为什么在一般项目中好像没有用到Looper.prepare()和Looper.loop();那是因为我们在UI线程中new Handler,系统在activityThread中帮我们加上了这二句,所以如果你自己创建一个线程,并在这个线程中new Handler(),就要自己加上这二句,否则会报错哦。

你可能感兴趣的:(android)