Handler
是结合线程的消息队列来发送、处理 Message
对象和 Runnable
对象的一种工具。它在创建时就与一个线程相关联,所有发送给它的消息都会在这个线程中处理。它本质上是一种工具,用来简化消息队列和消息循环的使用,也就是隐藏 Looper
与 MessageQueue
的实现细节。
![](https://img.haomeiwen.com/i689792/8e8036d2a37e6831.png)
最后附上一个预防内部 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<T> extends Handler {
private WeakReference<T> 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
时比较方便,使用的时候还是要记住应该用静态内部类来继承,否则就没有意义了。
用法
- 创建一个static内部类,继承
WeakReferenceHandler
并将泛型参数设置为这个Activity
的类型。 - 创建构造函数,接收
Activity
对象并调用super(T)
方法(直接用编译器的错误提醒创建就行)。 - 实现抽象方法
onHandleMessage()
,在这里处理消息,这个函数保证传递来的Activity
对象是非空的(也可以用错误提示直接创建)。
示例:
private static class CloseHandler extends WeakReferenceHandler<AdActivity> {
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;
}
}
}
网友评论