我有一个应用程序,其中我显示自定义对话和Toast消息一切正常,但应用程序有时会崩溃并显示logg错误为“Fragment LayoutTwo {820b58c}未附加到活动”。请帮助。
代码: -
CustomerTicketDialogClass ctdc = new CustomerTicketDialogClass(getActivity(),
"network failure",
getResources().getString(R.string.NetworkError_Message), "LayoutTwo");
ctdc.show();
ctdc.setCanceledOnTouchOutside(false);
答案 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();
}
}
}