长话短说:我不知道为什么在某些情况下我的RealmChangeListener无法按预期触发,并且正在寻求有关RealmChangeListener
为何无法工作的建议。
更新:我已验证RealmResults
保持有效= true;加载=假。
如果在添加更改侦听器后执行RealmResults.load()
,它将在日志中输出模糊的Throwing Exception 7
,并在我浏览Realm源代码时输出BadVersionException
。我认为此异常有意义,异步写入更新了Realm
,因此查询似乎不再起作用。但是,写在executeTransactionAsync
中的MainActivity
以及异步查询都是从主线程启动的。
--
我有一个MainActivity,在按下按钮时将执行异步写入。
我还有另一个按钮可以打开第二个显示数据的活动。
第二个活动使用ViewPager,每个选项卡都有一个片段。每个选项卡都有一个不同的查询。
因此,现在发生的事情如下:我打开第二个活动,该活动将实例化四个片段,而不是将它们附加到活动中。
然后,该活动执行查询,将每个RealmResults
传递给片段,在该片段中将安装RealmChangeListener
以在加载数据后显示数据。片段未附加到Activity时,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
。尽管如此,在四个
RealmChangeListeners
中,只有两个或更少(有时为零)触发。请注意,仅当在MainActivity上启动异步写入后不久打开第二个活动时,才会发生这种情况。如果我等待2秒钟,一切都会按预期进行。我确实确认了
RealmChangeListener
没有被垃圾回收,因为finalize()
在退出应用程序后被调用。我不知道什么会阻止侦听器工作。有什么我需要注意的吗? 最佳答案
您需要具有对RealmResults<T>
的(强)字段引用,以防止被GC引用。
如果RealmResults获得GC,则Realm无法再对其进行自动更新。