0

私が風刺される前に、メインの UI スレッドをブロックするために、シナリオは次のとおりです。

  1. サービスは 1 日に 1 回実行されます。完了するまでに約 15 秒かかります。重いデータベース トランザクション
  2. 偶然にも、ユーザーはその間にアプリを起動します
  3. ホーム画面はデータベースからデータを読み込みます
  4. しかし、データベースがロックされているため (ステップ 1)、これはエラーをスローします。

そのため、サービスが完了するまで UI スレッドを FREEZE する必要があります。UI は引き続き実行され、エラーがスローされるため、AsyncTask はありません。サービスが終了するまで「onResume」機能をスリープ状態にすることができました。しかし、その間、ユーザーに待つように指示するダイアログや、ユーザーにしっかりと座るように指示する進行状況バーを表示することはできません。

私が試したら

start onResume

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

end onResume

スレッドは正常に眠り、目覚めます。しかし、いまいましい進行状況ダイアログは onResume...再開するまで表示されません! 要するに、メイン スレッドをスリープ状態にする前にインジケーター (progressdialog またはダイアログ) を表示するにはどうすればよいですか?

サービスが再開されるまで、別のアクティビティをロードするソリューションを受け入れます。私はそれを試しましたが、以前の活動は引き続き順調に進んでいます :|

4

1 に答える 1

3

UI スレッドをブロックしている場合は、進行状況ダイアログを表示できません。

onResume でダイアログを呼び出したいと思いますが、onResume と onPaused が完了する前に、UI はダイアログの表示を開始しません。ただし、OnResume で UI スレッドをブロックしているため、ブロックが終了するまでこれには到達しません。したがって、それは不可能です。

待機を非同期タスクに入れ、完了したら UI スレッドにコールバックする必要があります。DB の更新が完了したときに実際のアクティビティを開始する読み込みアクティビティを実行することをお勧めします。

于 2012-06-05T15:46:20.553 に答える