【发布时间】:2011-06-02 02:36:36
【问题描述】:
当用户从选项卡 A 切换到选项卡 B 时,需要很长时间(6 秒),所以我放置了一个进度对话框,让用户知道应用正在处理它。时间线如下:
- Activity B onCreate - 创建 ProgressDialog 并将长任务放在后台线程中。
- Activity B onStart
- 活动 B onResume
- 活动 B 出现在屏幕上
这一切都适用于一个“小”问题——应用程序间歇性地崩溃,因为 onResume 函数引用了由后台线程创建的东西。换句话说,这是一个经典的比赛条件。
为了修复竞争条件,我在 onResume 中的引用之前对线程进行了“加入”,但这使得进度对话框在后台线程完成之前不会显示(即它显示一瞬间,然后消失)并且应用程序的行为就像在后台线程工作时挂起一样。显然,在 onResume 完成之前,进度对话框无法显示。
我的问题是:如何在不使程序崩溃的情况下显示 ProgressDialog?还是我需要从 onResume 中获取违规引用,或者让应用挂起?
【问题讨论】:
-
删除参考似乎是自然的解决方案。我还没有阅读
onStart和onResume的详细信息,但我想它们应该运行得非常快,而不必等待另一个线程中的冗长计算完成。