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(); } } });
这个错误是由于两个因素的综合影响而发生的:
- 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响应之后使用上下文通常是这个问题