handler泄漏2个方面:
1、Message 泄漏,
handler_verify.removeCallbacksAndMessages(null);(解决)
2、java中的内部类持有外部类的引用;
弱引用解决
private static class VerifyHandler extends Handler{
private WeakReference<?extends Activity> reference;
public VerifyHandler(Activity activity){
reference=new WeakReference<>(activity);
}
@Override
public void handleMessage(@NonNull Message msg) {
PageVerifyActivity activity = (PageVerifyActivity) reference.get();
if (activity!=null){
switch (msg.what){
case hand_check_word_type:
activity.checkAnswerStatus();
break;
case hand_show_error_type:
activity.startErrorAnimation();
if (!activity.animation_is_first){
// 动画效果只显示一次
this.sendEmptyMessageDelayed(hand_show_error_type,activity.animation_time);
activity.animation_is_first=true;
}
break;
}
}
}
}
封装:
public abstract class DefaultHandler<T> extends Handler {
protected final WeakReference<Context> mReference;
protected final WeakReference<T> mReferenceT;
public DefaultHandler(Context context, T t) {
mReference = new WeakReference<>(context);
mReferenceT = new WeakReference<>(t);
}
@Override
public final void handleMessage(Message msg) {
super.handleMessage(msg);
Context context = mReference.get();
if (context != null) {
if (context instanceof Activity && ((Activity) context).isFinishing()) {
removeCallbacksAndMessages();
} else {
T t = mReferenceT.get();
if (t != null) {
this.handleMessage(msg, t);
} else {
}
}
} else {
removeCallbacksAndMessages();
}
}
public abstract void handleMessage(Message msg, T t);
public void removeCallbacksAndMessages() {
removeCallbacksAndMessages(null);
mReference.clear();
mReferenceT.clear();
}
在activity中调用的时候:
private static class VerifyHandler extends DefaultHandler<PageVerifyActivity> {
public VerifyHandler(Context context, PageVerifyActivity pageVerifyActivity) {
super(context, pageVerifyActivity);
}
@Override
public void handleMessage(Message msg, PageVerifyActivity pageVerifyActivity) {
switch (msg.what){
case hand_check_word_type:
pageVerifyActivity.checkAnswerStatus();
break;
case hand_show_error_type:
pageVerifyActivity.startErrorAnimation();
if (!pageVerifyActivity.animation_is_first){
// 动画效果只显示一次
this.sendEmptyMessageDelayed(hand_show_error_type,pageVerifyActivity.animation_time);
pageVerifyActivity.animation_is_first=true;
}
break;
}
}
}
private VerifyHandler handler_verify=new VerifyHandler(this,this);
handler_verify.sendEmptyMessageDelayed(hand_check_word_type,100);//延迟100毫秒是为了让adapter有足够的刷新时间去做刷新操作