领域是executeTransactionAsync的onSuccess回调中的关闭错误

时间:2019-02-25 17:43:18

标签: android realm

在我的上一个发行版中,我开始遇到从未见过的新错误,这是许多个月以来未经编辑的代码。

  

致命异常:java.lang.IllegalStateException此Realm实例   已经关闭,无法使用。

我有获取数据的API调用,然后使用executeTransactionAsync方法将内容写入Realm,然后在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资源,因此在try语句完成后,应关闭该领域,但偶尔会在getLocalGroups(realm)中领域查询的onSuccess回调中崩溃

这段代码已经有一段时间了,现在它也发生在另一个地方,所以我对更改内容感到困惑(我更新了Android构建工具?),但这是错误的,领域实际上很接近-可以在onSuccess内使用?

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

此应用当前在Realm 4.4上使用了很长时间。由于某些重大更改,我们还没有时间升级到5。

1 个答案:

答案 0 :(得分:1)

您很幸运没有发生这种情况,在请求进行过程中您是否尝试退出应用程序? ;)

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

因此,try-finally立即关闭Realm,而无需等待异步事务完成,显然您“打开”的Realm(增加的本地实例数)在写事务期间已关闭。

令人惊讶的是,您在关闭Realm的情况下收到了onSuccess回调,我认为在这种情况下Realm吞没了该回调...

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");
}