问题:使用Handler handler = new Handler() 在activity中出来异步网络数据,多次调用handler导致activity销毁后
HandleMessage 还能调用 activity中的方法多次跳转目标页面。
原因: activity使用匿名内部类导致handler类对象持有activity引用导致内存溢出,activity没有被回收。所以你以为被销毁activity依然在。
解决:创建自定义接口,和自定义handler类。解耦activity和handler。handler使用WeakReference获得activity接口的弱引用。在activity需要回收时,不再受handler影响。
接口:
public interface OnHandlerCallBack {
public void mHandleMessage(Message msg);
}
handler类:
public class LoginHandler extends Handler {
private WeakReference<OnHandlerCallBack> mactivity;
public LoginHandler(OnHandlerCallBack activity){
mactivity=new WeakReference<OnHandlerCallBack>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
OnHandlerCallBack callBack =mactivity.get();
if(callBack!=null){
callBack.mHandleMessage(msg);
}
}
}
1,在activity中继承实现接口
implements OnHandlerCallBack
//统一通信 登录线程切换
@Override
public void mHandleMessage(Message msg) {
hideLoading();
if (msg.what == 0) {
//存储密码,跳转到主页面
} else {
ToastUtil.showShort(mContext, "FECK登录失败:" + msg.obj.toString());
}
}
2,handler 调用:
new LoginHandler(this::mHandleMessage)
问题解决。