2017-04-26 67 views
2

我有用于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

我知道这不是一个好主意,但你的DbManager应该是一个单身人士,所以你可以通过你需要的每个线程访问相同的领域 –

+0

它已经singelton –

+0

因此,如果它是一个全球性的单身人士,你会在哪里关闭境界? – EpicPandaForce

回答

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

+0

谢谢,但你的代码和我的代码没有什么区别,只是你的事务是异步的 –

+0

你隐式在realm.executeTransaction()函数中使用了一个新的Transaction吗? P.s .:你使用了Java标签,但那不是Java。 –

+0

是的,因为一切都一样,它是Kotlin –