在我的应用中,我正在使用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内容保留在后台,请帮忙!