我有用于CRUD操作的DBManager类,我想跨应用程序使用它,我知道Realm对象只能在它们创建的线程上访问,因此我无法在线程内部使用My DBManager类方法等等......
我想要的是从服务内部运行的线程调用DBManager中声明的updateUploadingFileStatus方法。
这是我的DBManager类
object DbManager {
private val realm: Realm by lazy { Realm.getDefaultInstance() }
fun saveOrRemoveUploadFile(filePath: String, save: Boolean){
val model = getUploadModelByFilePath(filePath)
realm.executeTransaction {
model.markedForUpload = save
realm.insertOrUpdate(model)
}
}
fun updateUploadingFileStatus(filePath: String, uploaded: Boolean){
val model = getUploadModelByFilePath(filePath)
realm.executeTransaction {
model.uploadedStatus = uploaded
}
}
fun getFilesForUpload() : List<UploadModel> {
return realm
.where(UploadModel::class.java)
.equalTo("markedForUpload",true)
.equalTo("uploadedStatus",false)
.findAll()
}
fun getUploadModelByFilePath(filePath: String) : UploadModel {
return realm.where(UploadModel::class.java).equalTo("filePath",filePath).findFirst() ?: UploadModel(filePath)
}
}
从另一个线程调用此方法抛出java.lang.IllegalStateException Realm access from incorrect thread.
如何解决这个问题?做这样的事情的好风格是什么?
答案 0 :(得分:0)
更改您的功能代码如下:
public void updateUploadingFileStatus(final String filePath, final Boolean uploaded) {
mRealm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
UploadModel model = getUploadModelByFilePath(filePath);
model.uploadedStatus = uploaded;
}
});
}
以前我通过使用新的交易解决了这个问题。我还使用Singleton类来访问RealmDB,并在网络的响应处理程序中调用此函数。这应该有用。