2013-07-30 4 views
9

私は主な活動と縛られたサービスを持っています。バインドされたサービスは、メインアクティビティのハンドラに送信されるメッセージをトリガするコマンドをネットワークから受信します。 Handlerのリファレンスをサービスに渡すことで、作業するためのすべてが得られました。そして、...私はMessengerと呼ばれるこの事を見つけた。ハンドラへの参照を渡すのではなく、なぜMessengerを使用するのですか?

メッセンジャー:他の人がそれにメッセージを送信するために使用できるハンドラに参照。これにより、あるプロセスでハンドラを指し示すMessengerを作成し、そのMessengerを別のプロセスに渡すことで、プロセス間でメッセージベースの通信を実装できます。

これは、いくつかの質問に触発:

  • は、長期的プロセスは、私がProcess and Thread ガイドラインの下で独立したプロセスを生成 ない限り、Messengerを使用する必要はありませんということですか?
  • メッセンジャーを使用するのは常に良い方法ですか?
  • 一般的に悪い考えをハンドラへの参照を渡していますか?
+0

これはあなたの質問に対する答えではありませんが、私はバックグラウンドスレッドにAsyncTaskを使うべきです。 (http://developer.android.com/reference/android/os/AsyncTask.htmlを参照してください) –

+1

私はバインドされたIntentServiceを使用しています。これは非同期要求を処理する必要があります。 AsyncTaskは適切ではないと私は考えています。なぜなら、私のサービスがインターネットからのコマンドをリッスンしている間に、AsyncTasksは短時間の操作(理想的には数秒)アクティビティの全ライフタイム。 – Rich

+1

また、サイド・コメントとして、AsyncTasksをUIスレッドから呼び出す必要があります – Selecsosi

答えて

7

用語プロセスは、私は私がプロセスの下に別のプロセスを生成し、ガイドラインをスレッド ない限り、Messengerを使用する必要はありませんということですか?

これは正しいです。リモートサービスをバインドする場合は、Messengerが必要です(別のプロセスで実行中など)。この場合、リモートサービスにHandlerへのポインタを提供する唯一のオプションは、Messengerを使用することです。

は、常にMessengerを使用することをお勧めしますか?

私はそう言わないだろう。それが本当に必要なときに使用します - リモートサービスの場合、またはサービスをバインドせずにサービスを開始する場合に使用します。あなたはIntentに余分のものとしてMessengerを梱包して、サービスを開始することができます。したがって、サービスをバインドせずにHandlerへの参照を渡すことができます。 Messengerが有用な場合の別のケースです。

は、一般的に悪い考えをハンドラへの参照を渡していますか?

アクティビティの開始と停止時にHandlerの登録と登録解除を適切に処理した場合、正常になるはずです。ローカルサービスにMessengerを使用する必要はありません。ハンドラを正しく登録解除しないと、メモリリークが発生します(サービスはハンドラを参照し、ハンドラは停止したアクティビティを参照します)。これにもかかわらず

は、私は地元のサービスのためOtto event busを使用することを好みます。

0

ハンドラを超えるメッセンジャーの主な利点は、メッセンジャーは、様々なクライアントから送信されたすべてのメッセージをキューに入れることが可能である、です。ハンドラーはそれを行うためにルーパーが必要ですが。だからメッセンジャーは、リモートプロセスの中でIPCで使用されたときに余分なエッジを与えます。

関連する問題