Android 我应该在哪里停止异步任务myAsync.cancel(true)

Android 我应该在哪里停止异步任务myAsync.cancel(true),android,asynchronous,android-fragments,Android,Asynchronous,Android Fragments,我有几个片段,每个片段都有一个非阻塞异步调用,该调用在其onPostExecute中更新UI 问题是,如果用户在异步仍在执行时切换到其他片段,这将导致NullPointerException 我尝试在每个片段的onDestroy中取消异步任务,但仍然出现异常。哪种方法是停止所有异步操作的理想方法 是碎片的onDestroy吗 asyncTask.cancel(true); 请帮忙 你真的想把它放到onPause中onDestroy不保证被调用,onPause是最后一个位置。而且,在onPaus

我有几个片段,每个片段都有一个非阻塞异步调用,该调用在其onPostExecute中更新UI

问题是,如果用户在异步仍在执行时切换到其他片段,这将导致NullPointerException

我尝试在每个片段的onDestroy中取消异步任务,但仍然出现异常。哪种方法是停止所有异步操作的理想方法

是碎片的onDestroy吗

asyncTask.cancel(true);

请帮忙

你真的想把它放到
onPause
onDestroy
不保证被调用,
onPause
是最后一个位置。而且,在
onPause
之后仍然加载GUI也不是一个很好的理由。在
onResume
中启动您的
AsyncTask

从页面:

onPause()在系统即将开始恢复以前的活动时调用。这通常用于将未保存的更改提交到持久数据、停止动画和其他可能消耗CPU的内容等


根据文档,这似乎是停止AsyncTask的最佳位置。

您可以在
onPause()
方法中停止
AsyncTask
对象。但是
AsyncTask
对象的
onCancelled()
onPostExecute()
方法在
doInBackground()
方法返回后仍然在UI线程上运行。您需要在
onPostExecute()
中包含保护代码,以确保不会自动触摸UI组件或操纵
片段

onPostExecute()在取消(布尔值)>调用此方法后不会被调用,从而确保永远不会调用onPostExecute(对象)。如果显示对话框,则可以调用onPause(),因此更好的方法是使用onStop()。是的,但是可能永远不会调用
onStop
。尽管如此,它比onDestroy更可能被调用,因此…您有一个观点,但是当对话框显示时会调用onPause,这样当用户不希望取消任务时,任务将被取消。此外,如果存在如此大的压力,AsyncTask很可能会与活动和片段一起被杀死。如果不知道AsyncTask的作用、是否处理isCancelled()和crashlogs,我们就无法判断是什么导致了异常。async任务是一个网络调用。我的列表在onPostExecute中更新