执行AsyncTask时被replace的碎片 – getActivity()上的NullPointerException

我最近将我的活动转换为碎片。

使用类似于Tab-Navigation的东西,片段在用户select另一个标签时被replace。 片段填充后,我至less启动一个AsyncTask从互联网上获取一些信息。 但是 – 如果用户切换到另一个选项卡,就像正在执行AsyncTask中的doBackground-method一样 – 片段被replace ,因此我在标记的行中得到一个NullPointerExceptionexception:

 @Override protected Object doInBackground(Object... params) { ... String tempjson = helper.SendPost(getResources().getText(R.string.apiid)); //ERROR: Fragment not attached ... } protected onPostExecute(Object result) { ... getActivity().getContentResolver() //NULLPOINTEREXCEPTION getView().findViewById(R.id.button) //NULL ... } 

getActivity()getResources()导致错误,因为我的碎片被replace。

我试过的东西:

  • 在我的AsyncTask上调用cancel方法(不会修正第一个错误,也不会修复执行onPostExecute()片段被replace的第二个错误)
  • 检查getActivity()是否为null或调用this.isDetached() (不是一个真正的修复,我需要检查它,每当我调用getActivity()等)

所以我的问题是:什么是最好的摆脱这些AsyncTask问题? 我没有使用活动的这些问题,因为他们没有“杀死”/分离标签更改(这导致更高的内存使用量 – 之所以我喜欢切换到碎片)

Solutions Collecting From Web of "执行AsyncTask时被replace的碎片 – getActivity()上的NullPointerException"

由于AsyncTask正在后台运行,因此您的片段可能会在完成时与其父级活动分离。 正如你发现的那样,你可以使用isDetached()来检查。 没有什么不对的,你不必每次都检查,只要考虑片段和活动的生命周期。

另外两个select:

  • 使用装载机,他们被devise为打碎更好
  • 将您的AsyncTask加载移动到父活动,并使用接口从碎片中分离。 该活动将知道片段是否存在,并相应地采取行动(如果片段不见了,可能会丢弃结果)。

今天,我遇到了同样的问题:如果AsyncTask尚未完成,当我更改显示的fragment ,并尝试访问view以填充更多元素时,它将返回一个NullPointerException

我解决了覆盖片段生命周期的一个方法的问题: onDetach() 。 此方法在fragmentactivity分离之前的那一刻被调用。

你需要做的是在AsyncTask上调用cancel()方法。 这将停止任务执行,避免NullPointerExecption

这里有一个onDetach()onDetach()

 @Override public void onDetach() { super.onDetach(); task.cancel(true); } 

检查此页面以获取有关片段生命周期的更多信息: http : //developer.android.com/reference/android/app/Fragment.html#Lifecycle并查看有关取消任务的更多信息: http : //developer.android。 COM /参考/安卓/ OS / AsyncTask.html

你尝试调用setRetainInstance(true); 在你的片段类的onCreate()函数?