2017-04-26 69 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 –