在executetransactionSatyAsync的OnSuccess回调中,领域是封闭的错误



我在上一个从未见过的版本中开始遇到新的错误,该版本是在几个月中没有编辑的代码上。

致命例外:java.lang.illegalstateException这个领域实例 已经关闭了,使其无法使用。

我有获取数据的API调用,然后在executeTransactionAsync方法中将内容写入roealm,然后onsuccess,查询所有记录(可能有其他记录),以返回回调。

api().getLocalGroups(1).enqueue(new Callback<LocalGroupBase>() {
            @Override
            public void onResponse(@NonNull Call<LocalGroupBase> call, @NonNull final Response<LocalGroupBase> response) {
                try (Realm realm = setupRealm(context)) {
                    realm.executeTransactionAsync(new Realm.Transaction() {
                        @Override
                        public void execute(@NonNull Realm realm) {
                            realm.copyToRealmOrUpdate(response.body().getResults());
                        }
                    }, new Realm.Transaction.OnSuccess() {
                        @Override
                        public void onSuccess() {
                            callback.onLoaded(LocalGroup.getLocalGroups(realm));
                        }
                    });
                }
            }
            @Override
            public void onFailure(@NonNull Call<LocalGroupBase> call, Throwable t) {
                callback.onError(t.getMessage());
            }
        });

public static RealmResults<LocalGroup> getLocalGroups(Realm realm) {
        return realm.where(LocalGroup.class).findAllSorted("name");
    }

它是在使用资源的尝试,因此在Try语句完成后,该领域应关闭,但偶尔会在getlocalgroups(ronem)

中的领域查询的OnSuccess回调中崩溃。

这种代码已经存在了一段时间,现在也发生在另一个位置,所以我对发生了什么变化感到困惑(我更新了Android构建工具?),但是这是错误的,现在领域实际上是关闭的 - 可在启用上吗?

如果我仍在尝试资源中,为什么领域会关闭?

该应用程序当前在Realm 4.4上,并且已经使用了很长时间了。由于一些破裂的变化,我们还没有时间进行升级为5。

您很幸运,这没有发生,您是否尝试在此请求进行时尝试退出该应用程序?;)

try (Realm realm = setupRealm(context)) { // <-- opens Realm
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(@NonNull Realm realm) {
            ... // <-- runs in background asynchronously for some time
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            callback.onLoaded(LocalGroup.getLocalGroups(realm)); // <-- runs after background async transaction is complete
        }
    });
} // <-- closes Realm

因此,在不等待异步交易完成的情况下,请立即关闭领域,显然,您"打开"的领域(增量的本地实例计数)在写入交易期间已关闭。

令人惊讶的是,您在关闭领域的情况下得到了onSuccess回调,我认为领域在这种情况下吞下了回调...

a,解决方案的黑客框架是:

api().getLocalGroups(1).enqueue(new Callback<LocalGroupBase>() {
        @Override
        public void onResponse(@NonNull Call<LocalGroupBase> call, @NonNull final Response<LocalGroupBase> response) {
            try (Realm realm = setupRealm(context)) {
                realm.executeTransactionAsync(new Realm.Transaction() {
                    @Override
                    public void execute(@NonNull Realm realm) {
                        realm.copyToRealmOrUpdate(response.body().getResults());
                    }
                }, new Realm.Transaction.OnSuccess() {
                    @Override
                    public void onSuccess() {
                        try(Realm r = Realm.getDefaultInstance()) {
                            callback.onLoaded(LocalGroup.getLocalGroups(r));
                        }
                    }
                });
            }
        }
        @Override
        public void onFailure(@NonNull Call<LocalGroupBase> call, Throwable t) {
            callback.onError(t.getMessage());
        }
    });

public static RealmResults<LocalGroup> getLocalGroups(Realm realm) {
    return realm.where(LocalGroup.class).findAllSorted("name");
}

最新更新