Problema: use Handler handler = new Handler () para generar datos de red asincrónicos en la actividad, y llame al controlador varias veces para que la actividad se destruya
HandleMessage 还能调用 activity中的方法多次跳转目标页面。
Motivo: la actividad utiliza una clase interna anónima para hacer que el objeto de la clase del controlador contenga la referencia de la actividad, lo que provoca un desbordamiento de la memoria y la actividad no se recicla. Entonces crees que la actividad destruida todavía está allí.
Solución: cree una interfaz personalizada y una clase de controlador personalizada. Actividad de desacoplamiento y manipulador. El controlador usa WeakReference para obtener una referencia débil a la interfaz de actividad. Cuando la actividad necesita ser reciclada, el manipulador ya no la afecta.
interfaz:
public interface OnHandlerCallBack {
public void mHandleMessage(Message msg);
}
clase de controlador:
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. Heredar e implementar la interfaz en la actividad
implements OnHandlerCallBack
//统一通信 登录线程切换
@Override
public void mHandleMessage(Message msg) {
hideLoading();
if (msg.what == 0) {
//存储密码,跳转到主页面
} else {
ToastUtil.showShort(mContext, "FECK登录失败:" + msg.obj.toString());
}
}
2. El manejador llama:
new LoginHandler(this::mHandleMessage)
problema resuelto.