如何使用从后台线程加载的RealmResult并在Android主线程中使用它

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

liuqingsong123 回答:如何使用从后台线程加载的RealmResult并在Android主线程中使用它

好吧,您提供的这两种解决方案都不适合android框架。

第一个解决方案:这很糟糕,因为MainThread不应该知道和处理Realm东西,MainThread是为更改布局和android框架而制作的

第二个解决方案:不好,因为您正在将数据库模型传递给View(该数据库模型应该对数据库或远程数据库一无所知)。

解决方案将是: 创建一个名为UserModel的对象,然后在从数据库中接收用户时在ViewModel中读取所有这些用户并提取值并为UserModel创建一个列表,然后将这些对象返回到View。

这是分离概念的一种好习惯,因为在视图中有一个充满Realm注释和字段的数据库对象很不好,然后分离仅对View具有重要值而没有任何数据库注释的对象。这样,您就可以明确责任分工,并且可以解决您遇到的这些问题。

遵循一些DesignPatterns是很重要的,RepositoryPattern是解决某些体系结构问题的很好的工具,您可以在此处阅读有关的主题:https://proandroiddev.com/clean-architecture-data-flow-dependency-rule-615ffdd79e29

希望有帮助!

本文链接:https://www.f2er.com/3162882.html

大家都在问