android中Handler、MessageQueue、Looper间关系

先来看一段普通开启子线程处理耗时任务的写法

final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
            }
        };
new Thread(new Runnable() {
            @Override
            public void run() {
                Looper.prepare();
                handler.obtainMessage(11);
                Looper.loop();
            }
        }).start();

其中关键的类有Handler,Thread,Runalbe,Looper,在源码的分析过程中还会有一个重要的类MessageQueue

逻辑都是从new Thread开始的一段旅程,Thread就是一个普通的类,实现了Runnable接口,而Runnable也只是一个普通的接口,里面只有一个待实现的run()方法。Thread的构造函数只也都是在调用本类的create(),在create()中add进当前的threadGroup中。threadGroup与thread的关系就是单个与群关系。

然后Looper这个神奇的类。在Looper.prepare()方法首先进行的MessageQueue初始化。而在MessageQueue的构造函数中调用了native方法nativeInit(),即进行了与底层库进行了调用。

接着Handler的内部构造, Handler的职责就是通过sendMessage()方法把message发送到messageQueue。在sendMessage()方法中最终调用的是messageQueue中的enqueueMessage(),而在messageQueue的enqueueMessage()方法中调用的native方法则是将当前消息按时间先后顺序进行排序,(未到时间的message进行等待否则进行排序)

然后就是执行Looper.loop(),此方法便是循环将message通过dispatchMessage()发送出去。dispatchMessage()方法中调用的即是我们常见的方法handleMessage().在此整个逻辑就有了闭环。

整个子线程与主线程通讯其实是将handler这个类一起传入到了内存共享区,等消息被send出去的时候再由handler进行处理

你可能感兴趣的:(个人提升)