安卓 Handler 脑图

Handler 是结合线程的消息队列来发送、处理 Message 对象和 Runnable 对象的一种工具。它在创建时就与一个线程相关联,所有发送给它的消息都会在这个线程中处理。它本质上是一种工具,用来简化消息队列和消息循环的使用,也就是隐藏 LooperMessageQueue 的实现细节。

安卓 Handler 脑图_第1张图片
脑图 Handler

百度脑图

最后附上一个预防内部 Handler 内存泄漏的工具类,几年前写的,代码已上线多年可直接使用。

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.annotation.NonNull;

import java.lang.ref.WeakReference;

public abstract class WeakReferenceHandler extends Handler {
    private WeakReference ref;

    public WeakReferenceHandler(T t) {
        super();
        ref = new WeakReference<>(t);
    }

    public WeakReferenceHandler(Callback callback, T t) {
        super(callback);
        ref = new WeakReference<>(t);
    }

    public WeakReferenceHandler(Looper looper, T t) {
        super(looper);
        ref = new WeakReference<>(t);
    }

    public WeakReferenceHandler(Looper looper, Callback callback, T t) {
        super(looper, callback);
        ref = new WeakReference<>(t);
    }

    protected T get() {
        return ref.get();
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        T t = get();
        if (t != null) {
            onHandleMessage(msg, t);
        }
    }

    public abstract void onHandleMessage(Message msg, @NonNull T t);
}

说是预防,其实就是使用 WeakReference 时比较方便,使用的时候还是要记住应该用静态内部类来继承,否则就没有意义了。
用法

  1. 创建一个static内部类,继承 WeakReferenceHandler 并将泛型参数设置为这个 Activity 的类型。
  2. 创建构造函数,接收 Activity 对象并调用 super(T) 方法(直接用编译器的错误提醒创建就行)。
  3. 实现抽象方法 onHandleMessage(),在这里处理消息,这个函数保证传递来的 Activity 对象是非空的(也可以用错误提示直接创建)。

示例:

private static class CloseHandler extends WeakReferenceHandler {
    CloseHandler(AdActivity activity) {
        super(activity);
    }

    @Override
    public void onHandleMessage(Message msg, @NonNull AdActivity a) {
        switch (msg.what) {
            case MESSAGE_CLOSE_MANUAL:
                a.closeManually();
                break;
            case MESSAGE_CLOSE_AUTO:
                a.closeAutomatically();
                break;
            case MESSAGE_COUNT_DOWN:
                a.countDown();
                break;
        }
    }
}

你可能感兴趣的:(安卓 Handler 脑图)