【问题标题】:What does "runs on UI thread" for onPostExecute() really mean?onPostExecute() 的“在 UI 线程上运行”的真正含义是什么?
【发布时间】:2012-05-21 13:23:40
【问题描述】:

考虑在 Activity 中启动的 AsyncTask。如果 Activity 被暂停或销毁会发生什么? onPostExecute() 会运行吗?如果是,将使用哪个 UI 线程?

只是想知道。

非常感谢。

【问题讨论】:

  • onPostExcecute 将运行,但如果您的 Activity 被销毁,则尝试在死线程上运行时抛出异常。如果您的 Activity 可能关闭时正在运行 AsyncTask,请考虑将您的代码移动到服务或使用加载器。
  • 如果 Activity 被破坏:它将崩溃,因为它丢失了与原始 Activity 的引用。 Incase Activity 暂停,它仍然在该 Activity 上运行。对于这种情况:您应该使用意图服务,并通过广播获取结果。

标签: android android-activity android-asynctask


【解决方案1】:

UI 线程在应用程序的整个可见生命周期中都可用,可能跨越多个活动的组合。

您在视图中所做的任何更改都必须在 UI 线程上执行,并且 AsyncTaskonPostExecute 通过在 UI 线程上执行内部指令来反映相同的逻辑。

您可以在自己的Thread 中使用 runOnUiThread 来更改视图。但是由于 AsyncTaskonPostExecute 方法(它也在 UI 线程上运行),所以逻辑上你不需要在那里使用 runOnUiThread


更新

关于您的问题:是的,onPostExecute 仍将被调用(因为它由单独的线程调用)即使您的活动被破坏并且如果该方法将操纵视图,您将简单地得到 强制关闭错误,因为对您的活动的引用不再可用。

【讨论】:

    【解决方案2】:

    它会在onPostExecute() 崩溃,因为 UI 线程就像一个进程对话框。它发生在我身上,我的 Activity 在我的 Asynctask 完成之前销毁。它说“窗口泄漏......”所以,我删除了onPostExecute()。不再崩溃..

    【讨论】:

      【解决方案3】:

      记得调用取消函数来避免 onPause 或 onDestroyed 异常。

      【讨论】:

      • 感谢您的回答。 Wagas 的回答和您的提示将使我了解如何进一步增强我当前的设计。
      猜你喜欢
      • 2014-03-18
      • 2017-05-06
      • 2012-03-30
      • 2011-10-10
      • 2012-08-03
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多