簡単に言えば、特定の状況下で RealmChangeListener が意図したとおりにトリガーされない理由がわかりません。なぜ aRealmChangeListener
が機能しないのかについてのアドバイスを探しています。
更新:滞在が有効であることを確認しましたRealmResults
= true; ロードされた=偽。変更リスナーを追加した後に実行すると、ログにRealmResults.load()
あいまいなメッセージが出力され、Realm ソースをステップ実行すると a が出力されます。この例外は意味があると思います。非同期書き込みが更新されたため、クエリが機能しなくなったようです。ただし、書き込みと非同期クエリの両方がメイン スレッドから開始されます。Throwing Exception 7
BadVersionException
Realm
executeTransactionAsync
MainActivity
-
ボタンを押すと非同期書き込みが実行される MainActivity があります。
データを表示する 2 番目のアクティビティを開く別のボタンがあります。
2 番目のアクティビティでは、ViewPager と各タブのフラグメントを使用します。各タブには異なるクエリがあります。
2 つ目のアクティビティを開きます。これは、4 つのフラグメントをインスタンス化しますが、それらをアクティビティにアタッチしません。
次に、アクティビティはクエリを実行し、それぞれRealmResults
をフラグメントに渡します。フラグメントにRealmChangeListener
は、読み込まれたデータを表示するために がインストールされます。RealmChangeListener
フラグメントがアクティビティにアタッチされていない場合、 が機能しない可能性がありますか?
とにかく、これはRealmResults
(によって作成されたfindAllAsyncSorted()
) を受け取り、アダプタのデータを更新することになっているフラグメントのメソッドです。
public void updateData(OrderedRealmCollection<Bean> realmCollection) {
Timber.v("Delegated data to fragment of adapter %s.", adapter);
this.data = (RealmResults<Bean>) realmCollection;
if (data.isLoaded()) {
Timber.d("Data is already loaded on adapter %s.", adapter);
adapter.updateDataManual(data);
}
if (!data.isValid()) {
Timber.e("Data is not valid.");
}
listener = new RealmChangeListener<RealmResults<Bean>>() {
@Override public void onChange(RealmResults<Bean> newResults) {
Timber.v("Change listener for manual data triggered: %d results in fragment for category %s and adapter %s.",
newResults.size(), category.toString(), adapter);
adapter.updateDataManual(newResults);
}
@Override protected void finalize() throws Throwable {
Timber.d("Finalizing change listener for adapter %s.", adapter);
super.finalize();
}
};
data.addChangeListener(listener);
MyTimer.setRepeatingCallback(() -> {
Timber.v("RealmResults in adapter %s are %s and %s, and the ChangeListener is %s.",
adapter,
data.isValid() ? "valid" : "invalid",
data.isLoaded() ? "loaded" : "not loaded",
listener);
return true;
}, 5000);
}
RealmResults
ご覧のとおり、クエリが有効であり、変更リスナーが追加されるまでロードされず、も もRealmChangeListener
ガベージ コレクションされないことを確認するように努力しました。
それでも、4 つのうちRealmChangeListeners
、2 つ以下 (ゼロの場合もある) しかトリガーしません。
これは、MainActivity で非同期書き込みを開始した直後に 2 番目のアクティビティが開かれた場合にのみ発生することに注意してください。2 秒待つと、すべてが意図したとおりに機能します。アプリを終了した後に が呼び出されるRealmChangeListener
ため、 がガベージ コレクションされていないことを確認しました。finalize()
何がリスナーの動作を妨げるのかわかりません。特に注意すべきことはありますか?