在使用handler的时候,常常因为handler持有Activity引用,在Activity关闭的时候,hanlder如果存在耗时操作,导致内存溢出的问题,简单加入一个WeakReference包装一下Handler就能解决啦!
public class WeakHandler<T extends WeakHandler.WeakHandlerCallBack> extends Handler {
private WeakReference<T> weakReference;
public WeakHandler(T t) {
this.weakReference = new WeakReference<>(t);
}
public WeakHandler(Looper looper, T t) {
super(looper);
this.weakReference = new WeakReference<>(t);
}
@Override
public final void handleMessage(Message msg) {
super.handleMessage(msg);
T t = weakReference.get();
if (t != null) {
t.handleMessage(msg);
}
}
public interface WeakHandlerCallBack {
void handleMessage(Message msg);
}
}
使用方法和正常的Hanlder都一样,初始化的时候构造函数传入实现WeakHandlerCallBack接口的引用即可:
public class MyActivity extends Activity implements WeakHandler.WeakHandlerCallBack {
private WeakHandler mHandler = new WeakHandler<WeakHandler.WeakHandlerCallBack>(this);
private static final int MSG_CODE = ...;
public void doSomething(){
mHandler.sendEmptyMessage(MSG_CODE);
}
@Override
public void handleMessage(Message msg) {
......
}
}