如何解决未附加到Activity的Fragment?

时间:2017-09-06 05:17:02

标签: android

我有一个应用程序,其中我显示自定义对话和Toast消息一切正常,但应用程序有时会崩溃并显示logg错误为“Fragment LayoutTwo {820b58c}未附加到活动”。请帮助。

代码: -

CustomerTicketDialogClass ctdc = new CustomerTicketDialogClass(getActivity(), 
            "network failure", 
            getResources().getString(R.string.NetworkError_Message), "LayoutTwo");
ctdc.show();
ctdc.setCanceledOnTouchOutside(false);

1 个答案:

答案 0 :(得分:0)

由于两个因素的综合影响,会发生此错误:

HTTP请求完成后,调用onResponse()或onError()(在主线程上工作),而不知道Activity是否仍然在前台。如果Activity消失(用户在其他地方导航),getActivity()将返回null。 Volley响应表示为一个匿名内部类,它隐式地保存对外部Activity类的强引用。这导致经典的内存泄漏。 要解决这个问题,你应该总是这样做:

Activity activity = getActivity();

if(activity!= null){

// etc ...

}

并且还在onError()方法中使用isAdded():

@Override

public void onError(VolleyError error){

Activity activity = getActivity(); 
if(activity != null && isAdded())
    mProgressDialog.setVisibility(View.GONE);
    if (error instanceof NoConnectionError) {
       String errormsg = getResources().getString(R.string.no_internet_error_msg);
       Toast.makeText(activity, errormsg, Toast.LENGTH_LONG).show();
    }
}

}