为什么图形界面的修改在单独的方法(onPostExecute)中进行,而不是由后台线程执行?
用户界面由Views和ViewGroups组成。这些是在UI 线程 aka Main Thread中创建和操作的。这是唯一允许创建和修改视图的线程。Ant 尝试从非 UI 线程执行任何 UI 相关操作都会引发异常。的AsyncTask有类似的方法onPostExecute
,onPreExecute
,onProgressUpdate
以迎合其与后台处理产生最常见的情况。
我将尝试通过使用异步任务下载文件的简单示例来解释用例。
onPreExecute - 将在后台处理开始之前调用。因此,可以在此处显示用于显示下载进度的进度条。然后doInBackground()
将被调用并开始下载。
onProgressUpdate - 每当publishProgress()
从调用此方法时都会调用此方法doInBackground()
。由于doInBackground()
在与 UI 线程不同的线程中运行,因此无法更新视图以反映下载进度。所以doInBackground()
会调用publishProgress()
下载进度。在 UI 线程中publishProgress()
调用onProgressUpdate()
,UI 可以从这里更新。publishProgress()
可以定期调用,如 30 秒或 1 分钟,以不断更新进度
onPostExecute - 一旦下载完成或后台任务,onPostExecute
将被调用并在 UI 线程中运行。在这里,我们可以隐藏进度并更新 UI 以指示下载已完成。
希望这能说明为什么 AsyncTask 有更新 UI 的方法
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句