在进行API调用时,我很少遇到这种错误。
java.lang.IllegalStateException: Fragment not attached to Activity
我尝试将代码放在isAdted()
方法中以检查片段当前是否添加到其活动中,但我仍然很少收到此错误。我不明白为什么我仍然会收到此错误。我如何防止它?
它在这条线上显示错误-
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();
}
}
});
这个错误的发生是由于两个因素的综合作用:
on响应()
或onError()
(在主线程上工作),而不知道活动
是否仍在前台。如果活动
消失了(用户导航到其他地方),get活动()
返回null。响应
表示为匿名内部类,它隐含地保存对外部活动
类的强引用。这会导致经典的内存泄漏。要解决此问题,您应该始终执行以下操作:
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();
}
}
}
碎片生命周期非常复杂,漏洞百出,试着补充一下:
Activity activity = getActivity();
if (isAdded() && activity != null) {
...
}
我发现了一个非常简单的解决方案isAdded()方法,这是一个片段方法,用于确定当前片段是否附加到其活动。
我们可以像在片段类中的任何地方一样使用它,例如:
if(isAdded())
{
// using this method, we can do whatever we want which will prevent **java.lang.IllegalStateException: Fragment not attached to Activity** exception.
}