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

  • 致命崩溃:焦点搜索返回了无法获得焦点的视图
  • IllegalStateException:应用程序的PagerAdapter在不调用PagerAdapter#notifyDataSetChanged的情况下更改了适配器的内容
  • 嵌套片段 - IllegalStateException“onSaveInstanceState后无法执行此操作”
  • java.lang.IllegalStateException:ActionBarImpl只能与兼容的窗口装饰布局一起使用
  • View不能被锚定到父CoordinatorLayout
  • IllegalStateException:Fragment 当前不在FragmentManager中
  • IllegalStateException - 片段支持库
  • android.media.audiofx.Visualizer每隔一段时间都会抛出exception
  • 这个错误是由于两个因素的综合影响而发生的:

    • 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来摆脱它。