android - java.lang.IllegalStateException : Fragment not attached to Activity

标签 android android-fragments android-activity android-volley android-lifecycle

我在进行 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/

相关文章:

java - 完成父类的申请

java - 如何添加到 cordova 中的 settings.gradle

java - QR 码图像未从我的 Android 应用程序中的位图中保存

android - 为什么要使用 fragment ?

java - 空点异常错误 - android.content.ContextWrapper.startService

android - Android中的动态启动 Activity ?

Android:如何在所有 EditText 上全局应用 android:inputType

android - Android 2.1(API 级别 7)上的视频缩略图

java - 在旋转手机上维护搜索 View 的结果

java - Android - 将日期从一个 fragment 添加到另一个正在运行的 fragment