【问题标题】:AsynTask showing UI element on doInBackground [closed]AsyncTask 在 doInBackground 上显示 UI 元素 [关闭]
【发布时间】:2018-06-13 10:10:36
【问题描述】:

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

【问题讨论】:

  • 这个问题太宽泛了。如果您分享了一些研究并卡住了,同时有这个问题,那很好。但是,SO 并不是问这个问题的最佳场所。
  • @TEHEMPRAH 请看一下我的问题得到理解和解释的标记答案。
  • 然后请看一下上面的标记,要求澄清您的具体问题。谢谢。

标签: android multithreading android-asynctask


【解决方案1】:

用户界面由ViewsViewGroups 组成。这些是在UI thread aka Main Thread 中创建和操作的。这是唯一允许创建和修改视图的线程。 Ant 尝试从非 UI 线程执行任何与 UI 相关的操作都会抛出异常。 AsyncTask 具有onPostExecuteonPreExecuteonProgressUpdate 等方法来满足后台处理出现的大多数常见场景。

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

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

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

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

希望这能说明为什么 AsyncTask 有这些方法来更新 UI

【讨论】:

  • 太棒了!谢谢先生的澄清。
  • 很好的解释。一位好老师在你身上;-)。
  • @greenapps 感谢您的赞赏。赞成票激发更多人回答:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多