【发布时间】:2019-11-05 01:12:34
【问题描述】:
在我的应用程序中,我使用ViewModel,我想将 Realm 实例和所有 CRUD 操作保留在后台线程中。 ViewModel 有一个MutableLiveData:
data class User(val userId: Long, val name: String) : RealmModel
class UserViewModel : ViewModel() {
private val realmThreadContext = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
lateinit var realm: Realm
init {
viewModelScope.launch(realmThreadContext) {
realm = Realm.getDefaultInstance()
}
}
val users: MutableLiveData<RealmResults<User>> = MutableLiveData()
suspend fun loadData() {
withContext(realmThreadContext) {
users.postValue(realm.where(User::class.java).findAll())
}
}
override fun onCleared() {
super.onCleared()
realm.close()
}
}
class UserActivity : AppCompatActivity() {
lateinit var viewModel: UserViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_user)
viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
viewModel.users.observe(this, Observer { users ->
tv_user_names.text = users.joinToString(", ") { it.name }
})
lifecycleScope.launch {
viewModel.loadData()
}
}
}
在Activity 中我观察MutableLiveData 并对视图的更改做出反应,但它会抛出异常,因为在Realm 中你不能在线程之间传递RealmObject。我想知道你是如何管理的?
我知道有一些解决方法。
一种是在主线程调用Realm.getDefaultInstance,调用findAllAsync得到RealmResults,然后注册一个监听器,观察变化,更新MutableLiveData。
另一种解决方案是在后台线程中调用Realm.getDefaultInstance,调用findAll获取RealmResults并调用copyFromRealm,将其传递给MutableLiveData。
第一个解决方案可能会更好,因为第二个解决方案会将数据加载到内存中?
但是,如果可能的话,我的目标是在后台保留任何 Realm 内容,请帮助!
【问题讨论】: