【问题标题】:How to show progressdialog when the main UI thread is blocked?当主 UI 线程被阻塞时如何显示进度对话框?
【发布时间】:2012-06-05 15:38:06
【问题描述】:

在我被讽刺之前,为了阻塞主 UI 线程,这里是场景:

  1. 服务每天运行一次 - 大约需要 15 秒才能完成。繁重的数据库事务
  2. 巧合的是,用户在那段时间启动了应用程序
  3. 主屏幕从数据库加载数据
  4. 但是由于数据库被锁定(步骤 1),这会引发错误。

所以我需要冻结 UI 线程,直到服务完成。没有 AsyncTask,因为 UI 将继续执行并抛出错误。我已经设法让“onResume”功能进入睡眠状态,直到服务完成。但在那段时间里,我无法显示任何对话框告诉用户等待或任何进度条告诉用户坐好。

如果我尝试

start onResume

if (service is running?)
    show progress dialog
    while the service is running, thread.sleep
    dismiss progress dialog

end onResume

线程睡得很好,醒来很好。但是该死的进度对话框直到 onResume...resumes 才会显示!底线,我如何在让主线程进入睡眠状态之前显示一个指示器(progressdialog 或 dialog)?

我对在服务恢复之前加载另一个活动的解决方案持开放态度。我已经尝试过了,但之前的活动继续愉快地进行:|

【问题讨论】:

    标签: android database thread-safety


    【解决方案1】:

    如果您阻塞了 UI 线程,则无法显示进度对话框。

    我猜你想在 onResume 中调用对话,但是在 onResume 和 onPaused 完成之前 UI 不会开始显示对话。但是,当您在 OnResume 中阻塞 UI 线程时,在阻塞结束之前不会达到此状态。因此这是不可能的。

    您需要将等待放在异步任务中,并在完成后回调您的 UI 线程。 最好是在数据库更新完成时进行加载活动来启动您的实际活动。

    【讨论】:

    • 谢谢 - 我会尝试你关于创建“加载活动”的建议,并让你知道它是如何工作的。我需要找到一种方法来确保首先调用活动,即使用户转到主屏幕并返回。嗯……
    • 这最终是最好的解决方案
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多