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

时间:2015-09-20 03:51:58

标签: android android-asynctask ui-thread

在我的Android应用程序中,我想严格遵循Android准则。因此,在执行AsyncTask之后,我有2个选项来更新带有结果的UI。

  1. 我可以使用回调监听器将结果发送回主线程,并从那里更新UI。
  2. 我还可以将所需的UI元素的引用传递给AsyncTask,并在onPostExecute中更新这些元素。
  3. 那么,哪种方法更好,为什么呢?

3 个答案:

答案 0 :(得分:1)

你必须真正理解线程,如果它是一个简单的回调监听器,它就不会改变运行代码的线程。如果是这种情况,则方法(1)和(2)或多或少相同。

如果你实际上是指使用Handler,那么它有一些差异,Handler实际上排队回调并稍后在Handler所在的线程中调用它创建

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

答案 1 :(得分:0)

很长的后台任务在onBackground AsyncTask函数上运行。在onBackground结束时,调用onPostExecute,您应该在其中进行UI更改。

如果您的活动中有AsyncTask,那么它可以正常工作。您可以更新onPostExecute内的UI视图,因为您可以访问它们。

如果您的AsyncTask是一个单独的课程,并且您无权访问您的活动的UI视图,那么您可以在onPostExecute功能中将结果返回到Activity和在那里更新UI。

答案 2 :(得分:0)

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

  1. 如果您只想更新自己的用户界面。我认为最好在onPostExecute内更新它们,因为您的代码会更简单明了。
  2. 但是,使用回调更灵活。因为您可以根据传递的回调执行任务所需的任务。