java - 从不同线程问题访问的领域数据库对象(仅在某些设备上)
问题描述
我有一个单例类“RealmDatabaseManager”,我有synchronized
从领域本地数据库读取/写入的方法。
这些方法如下所示:
public long getPendingImagesCount() {
synchronized (this) {
realm = Realm.getInstance(RealmUtils.getRealmConfiguration());
long count = realm.where(PatientRecordImage.class)
.count();
realm.close();
return count;
}
}
this
单例类的实例在哪里。
这些方法通过单例实例从主线程和工作线程访问。每个方法都会创建和关闭它自己的领域。
该代码在我正在测试的设备上没有问题,但我收到了来自某些设备的 Crashlytics 报告,给出了两个致命错误。
IllegalStateException: Realm objects can only be accessed on the thread they were created.
和
IllegalStateException: Realm instance can only be closed on the thread it was created.
这种方法有什么问题?如果需要,可以提供更多信息。
解决方案
可能是因为您将类变量设置为另一个领域,并且您遇到了一些相当复杂的多线程问题;与设备特定性无关。
解决方法:不要设置类级别变量?
public long getPendingImagesCount() {
try(Realm realm = Realm.getInstance(RealmUtils.getRealmConfiguration())) {
return realm.where(PatientRecordImage.class).count();
}
}
推荐阅读
- docker - Cannot access tomcat manager or any other default tomcat app when running tomcat in docker
- php - Apache 和虚拟主机返回 NOT FOUND
- javascript - JQuery 不加载 HTML 文件(在 Bootstrap 模板中)
- sql - 检索许多表上的数据 - Laravel
- c - 当文件名在 C 中作为命令行参数传递时,它们是如何存储的?
- docker - docker-compose up OSError 参数无效
- java - Eclipse/RapidClipse X 10.2.2 Java 元素更改通知侦听器发生异常
- reactjs - 上传放大托管时是否有特殊的方式来调用视频?
- javascript - 使用像哈巴狗这样的模板引擎的用户事件?
- vim - 如何反复水平滚动?