【问题标题】:Use ASyncTask onProgressUpdate to update UI使用 ASyncTask onProgressUpdate 更新 UI
【发布时间】:2013-07-21 13:00:20
【问题描述】:

我有一个 ASyncTask 试图

  1. 在磁盘上查找图像
  2. 检查是否在线更新

然后在onPostExecute更新图片

我想在检查磁盘(速度很快,但在 ListView getView 等)和在线检查后更新图像(即同步到 ui 线程)。

如果我正确阅读了帮助,我可以使用 publishProgress(Progress...) 调用 onProgressUpdate(在 UI 线程中执行)...但是,我可以确定顺序?我不关心时间(如果我必须稍等一下),但我想确保“磁盘进度状态”发生在“在线进度状态”之前

【问题讨论】:

    标签: android


    【解决方案1】:

    何时调用publishProgress() 以及传递给它的参数完全由您决定。

    如果您想从后台线程调用它两次 - 一次在磁盘检查之后,一次在网络检查之后 - 那很好。要区分 onProgressUpdate() 中的两个调用,只需跟踪您所处的状态或计算该函数已被调用的次数。

    UI 线程上的调用顺序与您在后台线程中对publishProgress() 的调用顺序相同。

    【讨论】:

      【解决方案2】:

      如果我理解正确,您是在问执行 publishProgress 是否以相同的顺序调用 onProgressUpdate。答案是肯定的,因为它通过处理程序向 UI 线程发布消息。

      这是来自 AsyncTask publishProgress 的代码

      sHandler.obtainMessage(MESSAGE_POST_PROGRESS, new AsyncTaskResult<Progress>(this, values)).sendToTarget();
      

      【讨论】:

        【解决方案3】:

        AsyncTask 通过将Runnables 发送到主线程Handler 来运行UI 线程上的方法。这个 Handler 获取 FIFO 队列中的每个 Runnable 并依次运行它们,没有并行性。因此,如果磁盘进度状态发生在在线进度状态之前,则保留publishProgress 的顺序。 同样适用于 publishProgress 和 onPostExecute 的顺序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-24
          • 1970-01-01
          相关资源
          最近更新 更多