1

ネットワーククライアントアプリケーションがあり、デバイスのローテーションと組み合わせてサーバーからの応答を処理するアプローチを検証しようとしています。基本的に、これを行います。

  1. アクティビティは、ネットワーク応答の受信者を登録します
  2. アクティビティは、インテントサービスを開始することによってネットワーク操作を開始します
  3. サービスは、終了したインテントをブロードキャストすることで応答します

私たちの(認識されている)問題は、デバイスを回転させると、アクティビティが破棄/再作成されることです。アクティビティの受信者が登録解除されonPause()てから再登録されるまでの間onResume()に、サービスによってブロードキャストされるインテントを見逃した可能性があります。

これは本当の問題ですか?

もしそうなら、私たちは次の解決策を仮定しました、

  1. まず、アクティビティとサービスの間の通信にインテントを使用しないでください
  2. 2つのブロッキングキューを作成します。たとえば、アプリケーションクラスのネットワーク要求と応答です。
  3. take()サービスは、リクエストキューからのスレッドを開始します
  4. take()アクティビティは、応答キューからのスレッドを開始します
  5. offer()ネットワーク操作を開始するときのリクエストキューへのアクティビティ
  6. offer()ネットワーク操作の結果を送信するときの応答キューへのサービス
4

1 に答える 1

0

はい、これはまれな状況で発生する可能性がありますが、ユーザーが電話を受けた場合は確実に発生します。この場合も、アクティビティは一時停止してから再開されます。ユーザーが長時間話していると、アクティビティから大量のブロードキャストが失われます。

私のアドバイスは、サービスなどのコンポーネントからの応答に早急な対応が必要な状況では、アプリケーション間で双方向通信を行うためにブロードキャストを使用してはならないということです。どのメカニズムを使用するかは、状況によって異なります。私の最新のプロジェクトでは、アプリウィジェットを更新するためにサービスを使用しています。このシナリオでは、いくつかのクエリを実行したり、いくつかのアクションを要求したりするために、サービスで静的コードを使用しています。

あなたの考えは良いように聞こえますが、複雑な実装を隠す可能性があります。私があなたの立場にある場合は、BoundServicesと呼ばれる組み込みのサービスメカニズムを使用することを検討します。今まで使ったことがありませんが、あなたのニーズに応えているようです。

編集

したがって、バウンドサービスの概念に基づいて、次のフローを提案します。

  1. アクティビティが始まります。いわゆるスティッキーサービスです。
  2. サービスは、ネットワーク応答の受信者を登録します。
  3. サービスは、ネットワーク応答に基づいて必要な情報を含むIbinderオブジェクトを維持します。
  4. アクティビティは、必要なときにいつでもサービスにバインドされ、情報を含むIbinderオブジェクトを取得して、必要なアクションを実行します。
  5. アプリケーションを終了する時間になると、Activityはサービスを停止し、自動的に終了します。

お役に立てれば...

于 2012-05-10T01:42:55.193 に答える