在所有线程中使用领域

时间:2017-04-26 08:39:37

标签: java android realm kotlin

我有用于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.如何解决这个问题?做这样的事情的好风格是什么?

1 个答案:

答案 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,并在网络的响应处理程序中调用此函数。这应该有用。