【问题标题】:Where should I stop my Async task myAsync.cancel(true)我应该在哪里停止我的异步任务 myAsync.cancel(true)
【发布时间】:2014-03-21 13:55:29
【问题描述】:

我有几个片段,每个片段都有一个解除阻塞的异步调用,它会更新其 onPostExecute 中的 UI。

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

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

是 onDestroy for Fragments 吗???

asyncTask.cancel(true);

请帮忙!

【问题讨论】:

  • 如果不知道 AsyncTask 做了什么,无论您是否处理 isCancelled() 和崩溃日志,我们都无法判断是什么产生了异常。
  • 异步任务是网络调用。我的列表在 onPostExecute 中更新

标签: android asynchronous android-fragments


【解决方案1】:

您实际上想将其放入onPauseonDestroy 不保证被调用,onPause 是最后一个地方。在onPause 之后仍然加载 GUI 并没有真正的理由。在onResume 中启动您的AsyncTask

来自activity lifecycle 页面:

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

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

【讨论】:

  • onPause() 可以在 Dialog 显示时被调用,所以更好的办法是使用 onStop()。
  • 是的,但onStop 可能永远不会被调用。不过,它比onDestroy 更有可能被调用,所以...
  • 你说得有道理,但是在显示对话框时会调用 onPause,因此当用户不希望它被取消时,任务将被取消。而且,如果压力这么大,AsyncTask 很可能会连同 Activity 和 Fragment 一起被杀死。
【解决方案2】:

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

【讨论】:

  • onPostExecute() 在 cancel(boolean) 之后没有被调用
  • > 调用此方法可确保永远不会调用 onPostExecute(Object)。 Android Docs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2019-09-17
相关资源
最近更新 更多