android Handler handler = new Handler () 활동 메모리 오버 플로우 활동이 핸들러를 파괴하고 문제를 여러 번 호출하여 대상 페이지로 이동

문제점 : 핸들러 핸들러 = 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)

 

문제 해결됨.

추천

출처blog.csdn.net/qq_36355271/article/details/106897810