java - 异步写入后不久添加时,RealmChangeListener 不会执行

标签 java android realm realm-java

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

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

-

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

我有另一个按钮,可以打开第二个显示数据的 Activity 。

第二个 Activity 使用 ViewPager,每个选项卡都有一个 fragment 。每个选项卡都有不同的查询。

所以现在发生的事情如下:我打开第二个 Activity ,它实例化了四个 fragment ,而不是将它们附加到该 Activity 。

然后,该 Activity 执行查询,将每个 RealmResults 传递给 fragment ,其中将安装一个 RealmChangeListener 以在加载数据后显示数据。当 fragment 未附加到 Activity 时,RealmChangeListener 是否会不起作用?

无论如何,这是 fragment 中接收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被垃圾收集。

尽管如此,在四个 RealmChangeListener 中,只有两个或更少(有时为零)触发。

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

最佳答案

您需要有一个对 RealmResults<T> 的(强)字段引用这样你就可以防止它被 GC 处理。

如果 RealmResults 被 GC 回收,那么 Realm 就无法再自动更新它。

关于java - 异步写入后不久添加时,RealmChangeListener 不会执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41804318/

相关文章:

java - 尝试使用 itext :Exception in thread "main" java. lang.NoClassDefFoundError 签署 pdf 时出错:org/bouncycaSTLe/cert/X509CertificateHolder

android - 如何从 Activity 类更新recyclerview textview

java - ReSTLet Android 客户端 - 如何将 ASP.NET Web API 的 JSON 响应映射到我的 Java 对象

encryption - 带 Realm 的 Electron 。 <未启用加密>

swift - 如何添加要设置的 Realm 对象

java - 在哪里可以找到 Java 7 的 jnlp.jar

java - Spring阻止用户通过浏览器和ajax访问url

java - 应用程序在新设备 (lollipop) 上显示错误,但在我的旧设备 (kitkat) 上运行正常

Android Realm ChangeListener 未被触发

java.lang.RuntimeException : com. google.gdata.client.authn.oauth.OAuthException:oauth_token_secret 不存在