2016-05-19 3 views
1

私は、アプリケーションがレルムデータベースを使用し、ChangeListenerが非同期クエリ結果に追加されるAndroidクラスを採用しています。ドキュメンテーションは、インスタンスが破棄された場合にメモリがリークしないように、リスナをonStartに追加してonStopで削除する必要があることを示しています。 dbコンフィグレーションとデフォルトインスタンスは、Applicationを拡張するクラスで宣言されているため、デフォルトのRealm dbインスタンスは保持されますが、クエリ結果は保持されますか?クエリの結果が持続しない場合、結果からリスナーを削除する必要があるのに対し、onClickListener(たとえば)では、リスナーを削除する必要はありません。レルムdb ChangeListener永続性 - メモリリーク

答えて

1

私はレルムの内部を知っているが、のは、控除を使用させないでください=)

アプリケーションは、限り、あなたのアプリケーションとして)生きるシングルトン(オブジェクトの1つのインスタンスです。

メンバとしてのRealm dbインスタンスは、Applicationオブジェクトと共に動作します。

アクティビティなどの呼び出し元は、結果にサブスクライブします(オブザーバーパターン - 「ねえ、私のために何かがあるときにpingしてください)。アクティビティがリスナーとして自分自身を追加するとき、アクティビティは参照を与えます。そのため、ガベージコレクタは設定変更後にアクティビティを取得できません(デバイスのローテーションなど)。

onStop - アクティビティが破壊される可能性があることを示すコールバックであるため、退会する必要があります(「私を保持しないでください」)。

1

です。 RealmChangeListenerRealmResultsに追加すると、レルムがRealmResultsがGCedであることを検出した後にリスナーがGCされます。レルムはRealmResultsの弱い参照を保持し、ある時点で弱い参照をチェックします。 がRealmに追加された場合、Realmインスタンスがクローズされた場合、またはremoveChangeListener/removeAllChangeListenersが呼び出された場合は削除されます。この場合、アプリケーションライフサイクルでRealmインスタンスを保持し、リスナーを手動で削除しないと、リークされます。

cpu/memリソースの浪費を避けるために、必要がなくなった場合は、一般的に削除することをお勧めします。

+0

GCedを定義できますか? – JaeW

+0

ガベージコレクション。以前の質問は無視してください。 – JaeW