我是否应该从 AsyncTask 的 OnPostExecute 更新 UI 元素?

Should I update UI elements from OnPostExecute of AsyncTask or not?

在我的 android 申请中,我想严格遵守 Android 准则。所以在执行 AsyncTask 之后,我有 2 个选项可以用结果更新 UI。

  1. 我可以使用回调侦听器将结果发送回主线程并从那里更新 UI。
  2. 我还可以将所需 UI 元素的引用传递给 AsyncTask 并在 onPostExecute 中更新这些元素。

那么,哪种方法更好,为什么?

较长的后台任务在 AsyncTaskonBackground 函数上 运行。在 onBackground 的末尾,onPostExecute 被调用,您应该在其中进行 UI 更改。

如果你的 AsyncTask 在你的 Activity 里面,它工作正常。您可以只更新 onPostExecute 内的 UI 视图,因为您可以访问它们。

当您的 AsyncTask 是一个单独的 class 并且您无权访问 Activity 的 UI 视图时,则在您的 onPostExecute 函数中您可以 return 结果到您的 Activity 并在那里更新 UI。

你要真正了解线程,如果它是一个简单的回调监听器,它不会改变代码所在的线程运行。如果是这种情况,那么方法(1)和(2)将或多或少相同。

如果你实际上指的是使用Handler,那么它有一些区别,Handler实际上排队回调并稍后在[=10=所在的线程中调用它] 已创建。

但是,由于 OnPostExecute 已经在 UI Thread 中,这意味着可以将 UI 元素更新为 (2)。 最重要 一点你应该知道的是你的 Activity 可能会在调用 OnPostExecute 时被销毁。如果是这样,您不应使用创建 AsyncTaskActivity 引用修改 UI。

如果您想在任务完成后更新 ui,这两种情况都适用。 onPostExecute 也在主线程中处理代码。哪种方法更好?这取决于您希望如何组织代码结构。

  1. 如果您只想更新 UI。我认为最好在 onPostExecute 中更新它们,因为你的代码会更简单明了。
  2. 不过,使用回调更灵活。因为你可以根据你传递的回调对任务结果做任何你想做的事情。