异步写入后不久添加RealmChangeListener时不执行

时间:2017-01-23 10:38:37

标签: java android realm realm-java

长话短说:我不知道为什么我的RealmChangeListener在某些情况下没有按预期触发,我正在寻找有关RealmChangeListener无法正常工作的建议。

更新:我已确认RealmResults保持有效= true;加载=假。 如果我在添加更改侦听器后执行RealmResults.load(),它将在日志中输出模糊的Throwing Exception 7,并在我单步执行Realm源时输出BadVersionException。我认为这个异常是有道理的,异步写入更新了Realm,因此查询似乎不再起作用。但是,executeTransactionAsync中写入的MainActivity以及异步查询都是从主线程开始的。

-

我有一个MainActivity,在按下按钮时将执行异步写入。

我有另一个按钮,用于打开显示数据的第二个活动。

第二个活动使用ViewPager,每个选项卡都有一个片段。每个选项卡都有不同的查询。

所以现在发生的事情如下:我打开第二个活动,它实例化四个碎片,而不是将它们附加到活动上。

然后,活动执行查询,将每个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);
}

正如您所看到的,我努力确保查询有效并且在添加更改侦听器之前未加载,并且RealmResultsRealmChangeListener都没有被垃圾回收。

仍然,四个RealmChangeListeners中只有两个或更少(有时为零)触发。

请注意,只有在MainActivity上启动异步写入后不久打开第二个活动时,才会发生这种情况。如果我等待2秒钟,一切都按预期工作。我确实验证了RealmChangeListener没有被垃圾收集,因为退出应用程序后会调用finalize()。我不知道是什么阻止听众工作。有什么具体的我应该注意的吗?

1 个答案:

答案 0 :(得分:0)

您需要RealmResults<T>的(强)字段引用,以防止它被GC加入。

如果RealmResults获得了GC,那么Realm将无法再自动更新它。