java.lang.IllegalStateException:片段未附加到活动

新手上路,请多包涵

在进行 API 调用时,我很少收到此错误。

 java.lang.IllegalStateException: Fragment  not attached to Activity

我尝试将代码放入 isAdded() 方法以检查片段当前是否已添加到其活动中,但我仍然很少收到此错误。我不明白为什么我仍然收到此错误。我该如何预防?

它在行上显示错误-

 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();
                        }
                    }
                });

原文由 Android Developer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 622
2 个回答

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

  • 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();
        }
    }
}

原文由 Yash Sampat 发布,翻译遵循 CC BY-SA 3.0 许可协议

这将解决您的问题。

将此添加到您的 Fragment

 Activity activity;
@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    activity = context instanceof Activity ? (Activity) context : null;
}

然后用 活动 更改 getContext() 、 getActivity() 、 requireActivity() 或 requireContext()

原文由 Jose 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题