4

私には労働者Serviceとたくさんの活動があります。すべてActivityにがありHandlerます。Activitesは、メソッドを使用してに送信Intentsすることにより、ジョブを開始できます。これらのジョブはキューに入り、順番に処理されます。ServicestartService

Handler完了したジョブの結果を報告するために、Messengerオブジェクトにラップされた適切なアクティビティIntentにジョブを説明するを提供します。は、これを介して呼び出しのServiceメッセージを送り返します。Activityこれは問題なく機能します。

しかし、提供されたものは、対応するものが破棄されHandlersた後でもメモリに残っているようで、完了メッセージを処理し続けます。Activites

  • どうすればいいの?ハンドラーは、それらが含まれている状態で破棄されるべきではありませんActivityか?
  • これによりメモリリークが発生しますか?
4

1 に答える 1

2

Service には、アクティビティ ハンドラーへの参照がまだある Itnents への参照があるため、ハンドラーはガベージ コレクションで使用できるようになりません。

Google IO のこのビデオを見たことがありますか? これは RESTful Web サービスを使用するアプリの構築に関するものであるため、直接関係はありませんが、長時間実行されるイベントに応答する責任を委任するアプローチは、部分的に問題に対応します。

あまりにも多くのことを変更したくない場合は、アクティビティの onClose または onDestroy で、担当している長時間実行されるタスクが不要になったことをサービス (およびそれを介してインテント) に通知する方法が必要です。ハンドラーへの参照を削除するため、GC はそれを取り除くことができます。

または、ServiceHelper クラスで実行中のタスクとそのライフサイクルへの応答の管理 (ビデオのように) を一元化します。そのクラスは、イベントが発生したときにイベントを発行でき、アクティビティはそれらのイベントをリッスンできます。

これには、コードが 1 か所にあるという利点があるため、サービスの処理方法を変更したい場合にすべてのアクティビティを変更する必要はありません。

于 2012-10-02T12:38:45.247 に答える