AsynTask在doInBackground上显示UI元素

时间:2018-06-13 10:10:36

标签: android multithreading android-asynctask

为什么修改图形界面是在单独的方法(onPostExecute)中执行而不是由后台线程执行?

1 个答案:

答案 0 :(得分:1)

用户界面由ViewsViewGroups组成。这些是在UI thread aka Main Thread中创建和操作的。这是唯一允许创建和修改视图的线程。 Ant尝试从非UI线程执行任何UI相关操作将引发异常。 AsyncTask包含onPostExecuteonPreExecuteonProgressUpdate等方法,以满足背景处理中出现的最常见情况。

我将尝试使用异步任务下载文件的简单示例来解释用例。

onPreExecute - 将在后台处理开始之前调用。因此,可以在此处显示用于显示下载进度的进度条。然后将调用doInBackground()并开始下载。

onProgressUpdate - 只要从publishProgress()调用doInBackground(),就会调用此方法。由于doInBackground()在与线程不同的线程中运行,因此无法更新视图以反映下载进度。因此doInBackground()会根据下载进度调用publishProgress()publishProgress()在UI线程中调用onProgressUpdate(),并且可以从此处更新UI。可以在30秒或1分钟的固定时间间隔内调用publishProgress()以持续更新进度

onPostExecute - 完成下载或后台任务后,将调用onPostExecute并在UI线程中运行。在这里,我们可以隐藏进度并更新UI以指示下载已完成。

希望这清楚为什么有AsyncTask有这些方法来更新UI