4

シナリオは次のとおりです。

  1. 2 つのアクティビティと 1 つのサービスがあります
  2. 最初のアクティビティは、ランディング ビュー/検索ページです。2 番目のアクティビティで検索結果が表示される
  3. 検索は常に内部 SQLite データベースに対して実行されます
  4. 定期的に (たとえば毎日) データベースをリモート ソースから更新する必要がありますが、これは長いプロセスです。
  5. ユーザーが更新中に検索を実行した場合、「お待ちください」進行状況アラートを表示しながら、更新が終了するまで待ちたいと思います。更新が完全に完了するまで、クエリを実行して検索結果を表示したくありません。
  6. データベースの更新は AlarmManager によってトリガーされ、更新の進行中に "UPDATING" ステータスをデータベースに入れるサービスによって実行されます。
  7. ステータスは簡単に照会できますが、待機して定期的にデータベースを再照会するにはどうすればよいですか? 私は AsyncTask を使用して検索結果を処理しています。私のひざまずいた反応は、wait() を使用したループをAsyncTask#doInBackgroundメソッドに入れることでしたが、これは危険であり、UI スレッドを制御していないため機能しませんIllegalMonitorStateException

この場合、適切に待機する「正しい」方法は何ですか (ステータスの更新がある場合もあります)。

PS「待機」コードをRunnableに配置し、AsyncTaskに到達する前でも実行しました。それはうまくいきます。たとえばThread.sleep(2000)、それが安全に行う方法であるかどうかはまだわかりません。誰でも経験がありFutureTaskますか?

4

2 に答える 2

2

更新中にユーザーが検索を実行した場合、「お待ちください」の進行状況アラートを表示しながら、更新が終了するまで待ちたいです。更新が完全に完了するまで、検索結果を照会して表示したくありません。

それはあなたの呼びかけですが、あなた自身の問題を引き起こしていることを忘れないでください。個人的には、この要件を破棄します。アラームが鳴ったからといって、ご不便をおかけすることはありません。

たとえば、アラームを無効にして、アクティビティがなくなったときに再度有効にすることができます。

または、アトミックな方法で更新を実行して(たとえば、テーブルのコピーで更新を実行してから、トランザクションでテーブルを同期する)、更新中にアクティビティがデータベースに安全にアクセスできるようにします。発生しています。

この場合、適切に待機するための「正しい」方法は何でしょうか(ステータスが更新されている場合でも)。

ある種のコールバック、またはおそらくブロードキャストインテントを介して、更新が行われたときにサービスにアクティビティを通知させます。これが発生するまで、進行状況インジケーターを有効にしてください。これはまだいくつかのタイミングの課題をもたらします、それが私がただ要件を捨てる理由です。

于 2010-02-17T23:22:53.163 に答える
0

有用な洞察を提供してくれた Mark に (いつものように) 感謝します。ここでは、上記のシナリオを (私の考えでは) どのように行うべきかを概説します。

  1. データベースを突き刺す代わりに、単にサービスにバインドして待機を開始します
  2. サービスにバインドできない場合、サービスは実行されていないため、それをモンキーする必要はありません。データベースにクエリを実行して、必要なことを行うだけです
  3. サービスが起動したら、待機を開始し、サービスから返されるフィードバックを処理します。これらは暫定的な更新であり、サービスが完了したことを示す最終的な指標である可能性があります
于 2010-02-18T01:32:00.243 に答える