Handler / MessageQueue / Looper 的个人理解

handler设计的目的是为了处理多线程下的消息执行顺序, 一般情况下用来防止多线程更新UI出现乱序/并发等混乱现象.

Handler 的作用是 发送消息和处理消息, 只是一个工具, 并不是使用 Thread 所必须的.

具体机制是:

Handler 在初始化时会获取当前 Thread 的 Looper, 其中 android 主线程会自动初始化一个 Looper, 而自己创建的线程则需要自己维护 Looper(通过 Looper.prepare 创建, 通过 Looper.loop 开启处理 message 的循环 ).
Thread 对应的 Looper 会维护一个 MessageQueue, Handler 把 Message 发送给 MessageQueue, 然后Looper 死循环查找 MessageQueue, 如果next Message != null, 那么这个 message 就会交给它内部的 target Handler 处理;


新建Thread有两种方式,
第一种:

        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.i("TAG", "run on Runnable");
            }
        }) {
            @Override
            public void run() {
                super.run();
                Log.i("TAG", "run on Thread");
            }
        }.start();

这种创建方式线程在执行完代码后( 先执行 Thread.run, Runnable 的 run 执行在 Thread.run 的 super 里面 )就结束了.
第二种:

        new Thread(new Runnable() {
            @Override
            public void run() {
                Looper.prepare();
                Log.i("TAG", "run on Runnable");
                Looper.loop();
            }
        }).start();

这种方式开启了死循环, Thread 会一直存活下去. 可以命名此 Thread, 使用 getLooper().quit 来销毁.


各类 handler.postRunnable 内部都是调用的 handler.sendMessageXX, Runnable其实就是message里面的一个变量.
所有类型的消息发送到最后都是调用的 enqueueMessage.
而 obtainMessage 是从消息队列中获取一个暂存的消息, 和发送消息没关系.
ps. postMessage 是 java 里的么?

猜你喜欢

转载自blog.csdn.net/j550341130/article/details/80078878