我在进行 API 调用时很少遇到此错误。
java.lang.IllegalStateException: Fragment not attached to Activity
我尝试将代码放在 isAdded()
方法中以检查 fragment 当前是否已添加到其 Activity 中,但我仍然很少收到此错误。我不明白为什么我仍然收到此错误。如何预防?
在线显示错误-
cameraInfo.setId(getResources().getString(R.string.camera_id));
下面是我正在进行的示例 api 调用。
SAPI.getInfo(getActivity(),
new APIResponseListener() {
@Override
public void onResponse(Object response) {
cameraInfo = new SInfo();
if(isAdded()) {
cameraInfo.setId(getResources().getString(R.string.camera_id));
cameraInfo.setName(getResources().getString(R.string.camera_name));
cameraInfo.setColor(getResources().getString(R.string.camera_color));
cameraInfo.setEnabled(true);
}
}
@Override
public void onError(VolleyError error) {
mProgressDialog.setVisibility(View.GONE);
if (error instanceof NoConnectionError) {
String errormsg = getResources().getString(R.string.no_internet_error_msg);
Toast.makeText(getActivity(), errormsg, Toast.LENGTH_LONG).show();
}
}
});
最佳答案
此错误是由于两个因素的综合影响而发生的:
- HTTP 请求完成后,会调用
onResponse()
或onError()
(在主线程上工作)而不知道Activity
是否仍在前台。如果Activity
消失(用户导航到别处),getActivity()
返回 null。 - Volley
Response
表示为一个匿名的内部类,它隐式地持有对外部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();
}
}
}
关于android - java.lang.IllegalStateException : Fragment not attached to Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28672883/