在上面的代码中,领域无法在新线程内执行其事务,不会显示任何错误,但也不会执行。
我已经尝试将事务放在线程之外,问题是它占用了UI线程,但是它工作得很好,并且我想在Retrofit和Realm进行工作时向用户显示平稳的负载< / p>
threadNova = new Thread() {
@Override
public void run() {
super.run();
try {
Response<Retorno> response = getCall.execute();
final Retorno responsebody = response.body();
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(realm1 -> {
//Save things on bank
// No errors but don't enter here either
});
} catch (IOException e) {
e.printStackTrace();
}
}
};
答案 0 :(得分:0)
您需要致电Realm.close()
。
您使用不带循环程序的Java线程,这意味着直到调用Realm.close()
之前,您的领域才会刷新,因此请在finally块中关闭您的领域。
try(Realm realm = Realm.getDefaultInstance()) {
Response<Retorno> response = getCall.execute();
final Retorno responsebody = response.body();
realm.executeTransaction(realm1 -> {
//Save
});
} catch (IOException e) {
e.printStackTrace();
}
}
来自文档:
如果您从与Looper关联的线程获取Realm实例, Realm实例具有自动刷新功能。 (Android的用户界面 线程是一个Looper。)这意味着Realm实例将是 定期更新为最新版本。这可以让您保持用户界面 毫不费力地不断更新最新内容!
如果从没有Looper的线程获取Realm实例 附加后,该实例中的对象将不会更新,直到您致电 waitForChange方法。保留旧版本的数据是 在内存和磁盘空间方面昂贵,并且成本增加 保留的版本与 最新。这就是为什么关闭Realm实例很重要的原因 在线程中完成操作后,立即执行。
如果要检查您的Realm实例是否具有自动刷新 是否激活,请使用isAutoRefresh方法。 在线程中完成操作后,立即执行。