我有几个片段,每个片段都有一个解除阻塞的异步调用,它会在其onPostExecute中更新UI。
问题是如果用户在async仍在执行时切换到其他片段,则会导致NullPointerException。
我尝试在每个片段的onDestroy中取消异步任务但仍然发生异常。什么是阻止我所有ASYNC的理想方法?
是片段的onDestroy ???
asyncTask.cancel(true);
请帮忙!
答案 0 :(得分:0)
你真的想把它放在onPause
中。 onDestroy
无法保证被调用,onPause
是最后一个地方。在onPause
之后仍然没有加载GUI的充分理由。在AsyncTask
开始onResume
。
来自activity lifecycle页面:
onPause()系统即将开始恢复上一个活动时调用。这通常用于提交未保存的持久数据更改,停止动画以及可能消耗CPU等的其他事情。
根据文档,这似乎是停止AsyncTask的最佳位置。
答案 1 :(得分:0)
您可以在AsyncTask
方法中停止onPause()
个对象。但是,AsyncTask
方法返回后,onCancelled()
对象的onPostExecute()
和doInBackground()
方法仍会在UI线程上运行。您需要在onPostExecute()
中设置保护代码,以确保您不会自动触及UI组件或操纵Fragment
。