문제점 : 핸들러 핸들러 = new Handler ()를 사용하여 활동에서 비동기 네트워크 데이터를 생성하고 핸들러를 여러 번 호출하여 활동을 파괴하십시오.
HandleMessage 还能调用 activity中的方法多次跳转目标页面。
이유 : 활동은 익명의 내부 클래스를 사용하여 처리기 클래스 개체가 활동 참조를 유지하도록하여 메모리 오버플로를 유발하고 활동이 재활용되지 않도록합니다. 따라서 파괴 된 활동이 여전히 존재한다고 생각합니다.
솔루션 : 사용자 정의 인터페이스 및 사용자 정의 핸들러 클래스를 작성하십시오. 활동 및 핸들러 분리. 핸들러는 WeakReference를 사용하여 활동 인터페이스에 대한 약한 참조를 얻습니다. 활동을 재활용해야 할 때 더 이상 핸들러의 영향을받지 않습니다.
상호 작용:
public interface OnHandlerCallBack {
public void mHandleMessage(Message msg);
}
핸들러 클래스 :
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. 활동에서 인터페이스 상속 및 구현
implements OnHandlerCallBack
//统一通信 登录线程切换
@Override
public void mHandleMessage(Message msg) {
hideLoading();
if (msg.what == 0) {
//存储密码,跳转到主页面
} else {
ToastUtil.showShort(mContext, "FECK登录失败:" + msg.obj.toString());
}
}
2. 핸들러는 다음을 호출합니다.
new LoginHandler(this::mHandleMessage)
문제 해결됨.