【问题标题】:AsyncTask: Is onPostExecute guaranteed to run after all calls to onProgressUpdate?AsyncTask:onPostExecute 是否保证在所有调用 onProgressUpdate 后运行?
【发布时间】:2010-06-29 03:39:24
【问题描述】:

我想知道在调用AsyncTask#onPostExecute 之后是否有可能获得对AsyncTask#onProgressUpdate 的“剩余”调用?我正在使用它们在同一个TextView 上设置文本,并且我不想设置诸如“完成!”之类的文本。然后让它在稍后被文本覆盖,例如“几乎在那里 - 90%”

另外,我假设onProgressUpdate 方法的工作方式类似于SwingWorker 方法,因为对publishProgress 的多次调用可能会在对onProgressUpdate 的调用发生之前叠加。我真的很想知道参数上的“较新”和“较旧”进度更新在哪里 - 也就是参数中位置 0 或位置 progress.length 的最新更新?

【问题讨论】:

    标签: android background backgroundworker android-asynctask


    【解决方案1】:

    publishProgress 的代码是:

    protected final void publishProgress(Progress... values) {
        sHandler.obtainMessage(MESSAGE_POST_PROGRESS,
                new AsyncTaskResult<Progress>(this, values)).sendToTarget();
    }
    

    sendToTarget 调用使用 Handler#sendMessage,文档中说“将消息推送到消息队列的末尾”。我理解这意味着您不会得到任何乱序更新并且它们会堆积起来。此外,对于每个publishProgress 调用,都会有一个对应的onProgressUpdate 调用。

    【讨论】:

    • 有趣!感谢您花时间查看此内容!猜猜它的工作方式与 SwingWorkers 不同:)
    【解决方案2】:

    嗯,很抱歉,但无论之前的答案如何,我都会回答: 是的,您可以保证在所有对 onProgressUpdate() 的调用之后都会调用 onPostExecute()。

    为什么?因为 doInBackground 负责调用 onProgressUpdate(),所以它不能在它之外发生。 onPostExecute() 在检索到结果后调用,因为它确实将其传输到 onPostExecute()

    问候

    【讨论】:

    • 我不相信这是有保证的..您有任何文件支持您的主张吗?这篇文章另有建议:stackoverflow.com/questions/8219115/…
    • 当然我没有提到它,但它是:它在所有情况下都得到保证,但在两者之间调用取消的那个。在这种特殊情况下,根本不会调用 onPostExecute。而是调用 OnCancel。这就是您的链接的意义所在。
    • 是的。但这不是意味着 onPostExecute 不能保证在所有 onProgressUpdate 调用之后都会被调用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2019-10-05
    相关资源
    最近更新 更多