源码分析Android题库

Android Handler消息机制,你知道多少

2022-02-22  本文已影响0人  Alsan_L3
1. Handler使用

在Activity中实例化一个Handler并实现他的handleMessage方法,然后在需要调用的地方通过使用sendpost系列方法,就可以轻松的将一个任务切换到Handler所在的线程中去,如下:

    private val handler: Handler = object : Handler() {
        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)
        }
    }

    handler.send*();
    handler.post*();

so easy!
然而,你真的了解Handler了吗,真的用好了吗,真的没有踩过Handler的坑?带着这些疑问,我们今天再来重新认识下Handler。

2. 消息机制的模型和架构

消息机制主要包含以下4个部分:Handler、Message、Looper、MessageQueue;下面我们一一介绍:

运行机制:在子线程执行完耗时操作时,通过Handler发送消息出去,将会调用MessageQueue.enqueueMessage向消息对列中添加消息,Looper通过loop()方法开启循环后,不断的从消息池中读取消息(MessageQueue.next),然后调用目标Handler的dispatchMessage传递消息,返回到Handler所在线程,目标Handler接收到消息后,通过handleMessage处理消息,如下图: Handler运行机制
3. 消息机制源码分析
4. 消息机制如何引起内存泄漏及解决方案
    private val handler = SafeHandler(this)

    private class SafeHandler(activity: Activity?) : Handler() {
        private val ref: WeakReference<Activity?>
        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)
            if (ref.get() != null) {
            }
        }

        init {
            ref = WeakReference(activity)
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        handler.removeCallbacksAndMessages(null)
    }
5. 如何在子线程中更新UI
        Thread(Runnable {
            Looper.prepare()
            Toast.makeText(this, "不会崩溃啦!", Toast.LENGTH_SHORT).show()
            Looper.loop()
        })
UiHandler.run(runnable);
6. Looper机制妙用
import android.os.Handler;
import android.os.Looper;

import androidx.annotation.NonNull;

public final class UiHandler {
    private UiHandler(){

    }
    private static final Handler HANDLER = new Handler(Looper.getMainLooper());

    public static void run(@NonNull Runnable runnable) {
        if (isMainThread()) {
            runnable.run();
        }else{
            HANDLER.post(runnable);
        }
    }

    public static boolean isMainThread() { 
        return Looper.myLooper() == Looper.getMainLooper(); 
    }
}
7. Handler延伸

上述Handler延伸可自行查找资料,这里不再一一讲述

8.自己实现一套消息机制

通过上面的分析,我们是否可以参考源码,试着自己实现一套简单的消息机制呢,欢迎大家踊跃参与!

上一篇 下一篇

猜你喜欢

热点阅读