3

バックグラウンド スレッド (サービス内にある可能性があります) を持つ複雑なアプリがあり、インターネットからデータを受信するときに、メインの表示アクティビティを通知する必要があります (いくつかのステータス インジケーターを更新するため)。すべてが同じプロセスで実行されます (そうしない理由はありません)。

ただし、状況によっては、これらのイベントが頻繁に発生する場合があります (1 秒あたり 5 回)。また、アクティビティが表示されていないか、破棄されている場合にも、イベントが発生する場合があります。この質問で唯一目新しいのは、効率の問題だと思います。たとえば、私はまだG1をターゲットにしています。

このスレッドにはいくつかの方法が記載されていますが、どれが十分に効率的で、アクティビティが破棄された場合に機能するかはわかりません。これらの方法は、私が従うことを好む「Android の方法」です。

動作する醜いアンチ Android の方法が 3 つありますが、これらには欠点もあります。

  1. セマフォで待機しているアクティビティにスレッドがあり、解放されたときに更新を行います。短所: 余分なスレッド、複数のイベント タイプの処理方法
  2. #1 と同様ですが、同時ブロッキング キュー オブジェクトを使用します。短所: 余分なスレッド、同じタイプのイベントが複数回キューに入る可能性がある (良くない)
  3. アクティビティのハンドラーへの静的参照を保持し、それを使用してアップデーターを実行します。短所: (a) アクティビティへの参照がリークする可能性がありますか? (b) アクティビティの状態が変わるとどうなりますか? (c) 必要なランナブルが 1 つだけの場合でも、複数のランナブルが存在する可能性があります。
4

1 に答える 1

3

また、アクティビティが表示されていないか、破棄されている場合にも、イベントが発生する可能性があります。

アクティビティが破棄された場合、更新するものはありません。ユーザーがそのアクティビティに再度アクセスすることを選択した場合、アクティビティは現在の情報を取得しonResume()て表示できます。

アクティビティがバックグラウンドにある場合も、更新する必要はありません。繰り返しますが、ユーザーがそのアクティビティに再度アクセスすることを選択した場合、アクティビティは現在の情報を取得しonResume()て表示できます。

アクティビティがリアルタイムでイベントの通知を受ける必要があるのは、そのアクティビティがフォアグラウンドにある場合のみです。その場合、リンク先の回答で概説したソリューションのいずれかが機能する可能性があります。バインディング オプションまたはMessengerは、おそらく最も軽量なソリューションです。

バックグラウンド スレッド (サービス内にある可能性がある) を持つ複雑なアプリがあります。

特定のアクティビティ インスタンスの範囲を超えて存続する場合は、「可能性がある」ではなく、「ある必要がある」。

私は3つの醜いアンチAndroidの方法を持っています

これらはいずれも、潜在的なメモリ リークなしには機能しません。

于 2011-07-09T11:06:40.813 に答える