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

在进行API调用时,我很less遇到这个错误。

java.lang.IllegalStateException: Fragment not attached to Activity 

我试图把代码放在isAdded()方法中来检查片段是否被添加到了它的活动中,但是我仍然很less得到这个错误。 我不明白为什么我仍然得到这个错误。 我怎样才能防止它?

它在线上显示错误 –

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

Solutions Collecting From Web of "java.lang.IllegalStateException:片段不附加到活动"

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

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

片段生命周期非常复杂,充满了错误,试图添加:

 Activity activity = getActivity(); if (isAdded() && activity != null) { ... } 

我发现非常简单的解决schemeisAdded()方法,这是片段方法之一,以确定此当前片段是否附加到其活动或不。

我们可以像片段类中的每个地方一样使用它:

 if(isAdded()) { // using this method, we can do whatever we want which will prevent **java.lang.IllegalStateException: Fragment not attached to Activity** exception. } 

我可能会迟到,但可能会帮助某人…..最好的解决scheme是创build一个全局的应用程序类实例,并在您的活动没有被附加的特定片段中调用它

如下所示

 icon = MyApplication.getInstance().getString(R.string.weather_thunder); 

这里是应用程序类

 public class MyApplication extends Application { private static MyApplication mInstance; private RequestQueue mRequestQueue; @Override public void onCreate() { super.onCreate(); mInstance = this; } public static synchronized MyApplication getInstance() { return mInstance; } } 

如果你正在实例化一个不能被实例化的片段,就会发生这个错误:

 Fragment myFragment = MyFragment.NewInstance(); public classs MyFragment extends Fragment { public void onCreate() { // Some error here, or anywhere inside the class is preventing it from being instantiated } } 

就我而言,当我尝试使用时遇到了这个问题:

 private String loading = getString(R.string.loading); 

这发生在片段没有上下文时,因此getActivity()方法返回null。 检查是否在获取它之前使用上下文,或者如果活动不再存在。 在fragment.onCreate和api响应之后使用上下文通常是这个问题

有时候,这个exception是由支持库实现中的一个错误引起的。 最近我不得不从26.1.0降级到25.4.0来摆脱它。