我在上一个从未见过的版本中开始遇到新的错误,该版本是在几个月中没有编辑的代码上。
致命例外: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");
}