欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android中Handler、MessageQueue、Looper间关系

程序员文章站 2022-03-08 10:19:38
...

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

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进行处理

相关标签: handler