【问题标题】:Android - AsyncTask, are all progressPublish calls published?Android - AsyncTask,是否所有 progressPublish 调用都已发布?
【发布时间】:2014-01-30 00:39:43
【问题描述】:

官方:

http://developer.android.com/reference/android/os/AsyncTask.html

onProgressUpdate(Progress...),调用后在 UI 线程上调用 发布进度(进度...)。执行时间为 不明确的。此方法用于显示任何形式的进度 后台计算仍在执行时的用户界面。 例如,它可以用于动画进度条或显示登录 一个文本字段。

它还说时间是不确定的,而不是实际发布的东西。

我可以看到一个只发布提交的最新进展的案例,并且适用于所有人。

假设有一个巨大的缺失峰值并且已经发布了 100 个进度更新,为什么不丢弃旧的 99 - 如果它是用于进度条等,或者显示当前正在加载的内容,为什么还要费心浏览?

但是,如果它不丢弃任何进度更新并按顺序发布它们,这将是从后台线程“流式传输”任何类型的列表结构的好方法,而不是存储所有这些结果并返回一个列表当它完成时。

异步任务是否按照接收到的顺序发布所有进度更新(并且在运行帖子之前执行内容)

无法测试行为,因为它不是确定性的,我可能很幸运,或者我的设备可能很快,这就是我问的原因。您永远不应该测试(并从中推断出)与线程有关的任何事情(如果这样可以节省一个新手,那么值得一写)

【问题讨论】:

    标签: android multithreading android-asynctask


    【解决方案1】:

    好吧here's the source。这里的相关部分确实似乎表明每次调用 publishProgress 都会导致伴随调用 onProgressUpdate

    /**
         * This method can be invoked from {@link #doInBackground} to
         * publish updates on the UI thread while the background computation is
         * still running. Each call to this method will trigger the execution of
         * {@link #onProgressUpdate} on the UI thread.
         *
         * {@link #onProgressUpdate} will note be called if the task has been
         * canceled.
         *
         * @param values The progress values to update the UI with.
         *
         * @see #onProgressUpdate
         * @see #doInBackground
         */
        protected final void publishProgress(Progress... values) {
            if (!isCancelled()) {
                sHandler.obtainMessage(MESSAGE_POST_PROGRESS,
                        new AsyncTaskResult<Progress>(this, values)).sendToTarget();
            }
        }
    

    【讨论】: