在我的上一个发行版中,我开始遇到从未见过的新错误,这是许多个月以来未经编辑的代码。
致命异常: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。
答案 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");
}