为什么修改图形界面是在单独的方法(onPostExecute)中执行而不是由后台线程执行?
答案 0 :(得分:1)
用户界面由Views和ViewGroups组成。这些是在UI thread aka Main Thread中创建和操作的。这是唯一允许创建和修改视图的线程。 Ant尝试从非UI线程执行任何UI相关操作将引发异常。 AsyncTask包含onPostExecute
,onPreExecute
,onProgressUpdate
等方法,以满足背景处理中出现的最常见情况。
我将尝试使用异步任务下载文件的简单示例来解释用例。
onPreExecute - 将在后台处理开始之前调用。因此,可以在此处显示用于显示下载进度的进度条。然后将调用doInBackground()
并开始下载。
onProgressUpdate - 只要从publishProgress()
调用doInBackground()
,就会调用此方法。由于doInBackground()
在与线程不同的线程中运行,因此无法更新视图以反映下载进度。因此doInBackground()
会根据下载进度调用publishProgress()
。 publishProgress()
在UI线程中调用onProgressUpdate()
,并且可以从此处更新UI。可以在30秒或1分钟的固定时间间隔内调用publishProgress()
以持续更新进度
onPostExecute - 完成下载或后台任务后,将调用onPostExecute
并在UI线程中运行。在这里,我们可以隐藏进度并更新UI以指示下载已完成。
希望这清楚为什么有AsyncTask有这些方法来更新UI