2013-03-24 17 views
5

基本的な質問 - PreferenceActivityを実装するとOnSharedPreferenceChangeListenerを実装する必要がありますか?または、この機能を別のクラスで定義する必要がありますか?他のアプローチに比べて何らかの理由がありますか?Android:OnSharedPreferenceChangeListenerをどこに定義/登録する必要がありますか

また、リスナーの登録先はどこですか?私はthe docsを意味し、常識はそれぞれonResume/onPauseに登録/登録解除を指示しますが、azillionregistrationsにはonCreateが表示されます。

また、登録解除に失敗した場合には、私はあまり確かではありません(hereは登録されていない可能性があります。onStopは必ず呼び出されることはありません)。私は私の他の活動の一つに戻ったら、だから私は、インスタンスのために持っている場合

class MyPref extends PreferenceActivity implements 
      OnSharedPreferenceChangeListener { 
    SharedPreferences sharedPreferences; 
    // init sharedPreferences 
    onStart(){ 
     sharedPreferences.registerOnSharedPreferenceChangeListener(this); 
    } 
    // no unregistration 
} 

これはMyPrefインスタンスをリークしますか?

最後に、同じ考慮事項がOnPreferenceChangeListenerに適用されますか?

編集:実際に登録を解除する方法はありません。OnPreferenceChangeListener - 私は盲目ですか?

答えて

1

私は、個人的な好みとは別に、リスナーの特定の場所に有利な理由がないとは思っていません。 Activityを実装するか、または内部クラス(匿名かどうか)を使用することですべてOKです。

リスナーとしてActivityのような既存のオブジェクトを使用していない場合は、リスナーオブジェクトへの参照を保持する必要があります。 this answerによれば、ガベージコレクションを行わない(実際には何も聞かない)場合があります。


がソースにビットを掘った、 SharedPreferencesImplしません原因aを登録解除に失敗したことを意味し、登録されたリスナー( source、ライン72から73、186から196)を含むように WeakHashMapを使用しているようですリーク。

あなたが言うように、ドキュメントはonResume()/onPause()を使用することをお勧めします。これはおそらくリークとは関係ありませんが、代わりに不要な処理を行っているバックグラウンドアプリを防ぐためです。

0

/onResumeに登録と登録解除を行うことは、何のためにも余計な作業です。

あなたは、このようなあなたのクラスの一部としてリスナーの匿名の実装を行うことができます

[class level] 
... 
OnSharedPreferenceChangeListener mListener = new OnSharedPreferenceChangeListener() { 
    onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     // your code here 
    } 
}; 
... 
[class level] 

どこ適用次に、あなたがそれを設定します。これを行うと、リスナーは/onResumeの別のオブジェクトとして再作成されません(アプリケーションが終了し、Activityサブクラスを再度読み込む必要がない限り)ので、割り当ては無意味です。常に同じオブジェクトを参照してください。一方、あなたのアプリが殺されると、onCreateが再び呼び出されます。

内部クラスを実装するかどうかに関しては、コードの清潔さが向上しているため、匿名の実装を好む傾向があります(クラス名を気にする必要はありません)。ブラケットの数を減らします。しかし、それは本当に好みのものなので、どんな感じでも良いですか?

+1

_登録と登録解除 - なぜですか?リスナーの登録を解除する必要はありませんか?私が尋ねたリークはどうでしたか? –

+0

登録を解除する必要はありません。アプリを殺すことを決めた場合、システムは単にそれを殺すだけです。さらに、各アプリケーションは独自のVMインスタンスで実行されます。このVMインスタンスも強制終了されるため、登録を解除する必要はなく、リークは発生しません。プロセスが終了するとすべてのメモリが解放されます(カーネルはその処理を行います) 。そのため、データをonPauseまたはonStopで永続ストレージに保存することをお勧めします。しかし、これは 'onPause'と' onResume'の間では起こりません。 – Shade

+0

@ Mr_and_Mrs_D、あなたはこの質問に対してより良い答えを見つけましたか?もしそうなら、皆の利益のためにそれに答えるのはなぜですか? – Shade

関連する問題