2011-06-29 6 views
1

私はリスナーとしてアクティビティをとるマネージャクラスを持っています。私はマネージャーを使ってスレッドコールや作業などを行い、その後、リスナー(アクティビティ)にコールバックします。どのライフサイクルイベントがリスナーを登録/登録解除するのに最適ですか?

アクティビティが表示されなくなったときに、アクティビティをリスナーとして登録および登録解除したいとします。これにより、望ましくない変更が発生しないようにします(アクティビティが表示されなくなったときに表示されるダイアログなど)。

私の質問は、どのようなライフサイクルイベントがこの登録を行うのが最善かです。 onPause()とonResume()から始めました。これは、onActivityResult()で何かをしていたとき以外はうまくいきました。 onActivityResult()はonResume()よりも前に呼び出されるので、私のマネージャーは必ずしも時間通りに登録されません。

私はonResume()とonActivityResult()に登録する必要がありますか、これにはより良い方法がありますか?

+0

アクティビティのライフサイクル全体にわたってリスナーが必要な場合は、onCreateとonDestroyを使用してください。 – Spidy

+0

これは私のためには機能しません。ネットワークスレッドを送信し、ユーザーがアクティビティスタックで前方にナビゲートします。アクティビティはまだ登録されています(onDestroy()は呼び出されません)。コールが戻ってきて、ダイアログボックスをポップアップすると、アクティビティが表示されないためクラッシュします。 – sgarman

答えて

2

代わりに、onResume()にリスナーが登録されるまで、onActivityResult()で現在実行されている処理を延期することもできます。

これを実行する方法としては、メッセージキューへの投稿(例: onResumeによって呼び出されるようにRunnableオブジェクトを設定するか、onActivityResult()が受け取った結果データを単に格納することによって、ハンドラを使用することができます。

これにより、リスナー・メソッドが呼び出されたときに、実際にアクティビティがフォアグラウンドになっていることも保証されます。

+0

これまでのところ、これを行うには、これがおそらく最も適切な方法です。実際にonActivityResultにリスナーを登録するほうが簡単であるため、実際にこれを実行するかどうかはわかりません。 – sgarman

0

Managerクラスの現在のアクティビティのハンドルを持つことができます。その存在をonCreate()に登録し、他のアクティビティによってonCreate()、または現在のアクティビティのonBackPressed()のいずれかに登録を解除します。

関連するメモでは、コントローラーがビューの状態を認識している(コントローラーは各アクティビティーのonCreate()onBackPressed()を追跡できる)MVC(または同様の)アーキテクチャーをお勧めします。

+0

これらのマネージャのすべてがシングルトンであるわけではありません。つまり、他のアクティビティによって参照されることはできません。私がこれにアプローチするのは、アクティビティが実際にビューコントローラであるということです。マネージャは、ビューコントローラが行う必要のない複雑なロジックのほうを助けます。 – sgarman

+0

私が意味していたのは、必要に応じて、さまざまなマネージャーに話すことができるシングルトン(単純化のため)コントローラーを持つことはできませんか? – sparkymat

0

onResume()とonPause()がこれに最適です。ドキュメンテーションごとのonDestroy()は、多くの人にとって好きなものですが、呼び出される保証はありませんので、一時停止と再開に固執してください。

+0

あなたの回答をありがとう、私は同意するが、私のonActivityResultの問題はどうですか? – sgarman

+0

あなたの「結果」を待ち行列(FIFO)に保存し、アクティビティ・レジスタが先に進んでデータを送信すると、必要に応じて処理することができます。 onPause()を介してアクティビティの登録が解除されるまで、データの送信を続けます。その時点で、値がキューに再度格納されます。 – BonanzaDriver

関連する問題