0

簡単に言えば、特定の状況下で RealmChangeListener が意図したとおりにトリガーされない理由がわかりません。なぜ aRealmChangeListenerが機能しないのかについてのアドバイスを探しています。

更新:滞在が有効であることを確認しましたRealmResults= true; ロードされた=偽。変更リスナーを追加した後に実行すると、ログにRealmResults.load()あいまいなメッセージが出力され、Realm ソースをステップ実行すると a が出力されます。この例外は意味があると思います。非同期書き込みが更新されたため、クエリが機能しなくなったようです。ただし、書き込みと非同期クエリの両方がメイン スレッドから開始されます。Throwing Exception 7BadVersionExceptionRealmexecuteTransactionAsyncMainActivity

-

ボタンを押すと非同期書き込みが実行される 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()何がリスナーの動作を妨げるのかわかりません。特に注意すべきことはありますか?

4

1 に答える 1

1

GCされないように、への(強力な)フィールド参照が必要RealmResults<T>です。

RealmResults が GC されると、Realm はそれを自動更新できなくなります。

于 2017-01-23T11:33:08.807 に答える