【问题标题】:Partial order: AsyncTask.get() and onPostExecute()?部分顺序:AsyncTask.get() 和 onPostExecute()?
【发布时间】:2012-05-05 11:46:17
【问题描述】:

我正在从我的 UI 线程(在 我的活动的 onCreate() 处理程序)。我保证活动 由于配置更改而不会重新启动(它忽略方向更改, 例如)。

在我的 Activity.onCreate() 中:我使用 asynctask.execute(),然后是 UI 线程做一些工作,然后在 Activity.onCreate() 结束之前调用 asynctask.get(...) 进行同步。

根据日志,我的 asynctask.onPostExecute() 被调用 ages 在 asynctask.get() 返回之后。更准确地说, onPostExecute 被称为 在 Activity.onResume (!) 返回之后。 (所以它确实被调用了,我的方法定义没问题,我也使用了@Override。)

我在某处读到它,因为 onPostExecute() 在 UI 线程的处理程序,UI 线程必须为它做好准备——为什么 在这种情况下它没有准备好吗?我的应用程序从方向更改开始,但由于我在清单中的设置,它不会导致任何配置更改。

有没有保证什么时候 onPostExecute() 会被调用 relative 到 asynctask.get() ?

【问题讨论】:

    标签: android android-asynctask oncreate


    【解决方案1】:

    根据日志,我的 asynctask.onPostExecute() 在 asynctask.get() 返回后被调用了很长时间。更准确地说,onPostExecute 在 Activity.onResume (!) 返回后调用。

    根据我对源代码的阅读,get() 只等待doInBackground() 完成。

    相对于 asynctask.get() 何时调用 onPostExecute() 是否有保证?

    根据我对源代码的阅读,onPostExecute() 将在get() 返回后的某个时间被调用。但是,这不是“保证”,因为这种行为没有记录在案,因此可能会发生变化。

    【讨论】:

    • 这真的很有趣。实际上,文档避免指定这一点,但这使得 onPostExecute() 非常不切实际。文档至少应该声明不能保证何时调用 onPostExecuted()。我最初假设它在 get() 返回之前执行。我试图深入研究 Android 的源代码,但由于 get() 使用的是非常低级的服务,所以我没有幸运地发现 onPostExecute() 和 get() 的预期顺序(如果有的话)。跨度>
    • @ThomasCalc:“然而,这使得 onPostExecute() 变得非常不切实际”——并非如此,因为你是三年来我遇到的第一个使用 get() 的人。
    • 我在应用程序的设置阶段使用 Asynctask。它从外部存储中读取数据。但是只有在加载所有数据后,应用程序才应显示其欢迎屏幕。请注意,它的数据不多,否则实际上会阻塞解决方案(由于 get()),但是在加载数据时,GUI 可以准备其布局(setcontentview 等),并在 onCreate( ),它们会同步。
    • @ThomasCalc:我并不是说你的做法是错误的。不过,我是说“这使得 onPostExecute() 非常不切实际”的说法被夸大了。它可能会使onPostExecute()“非常不切实际”对于您的用例,但您的并不是AsyncTask 的唯一用例。
    • 是的。对我的问题类不切实际。
    猜你喜欢
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多