首页 > 解决方案 > 数据绑定视图模型与 RxJava 2

问题描述

所以基本上到目前为止,我一直在应用程序中广泛使用 rxjava2,但决定检查数据绑定、视图模型和实时数据。而且我不确定我是否做对了所有这些,因为除了在设备旋转期间保存状态之外,我看不到切换的任何其他明显好处,我什至可以说我看到在视图之间引入数据绑定与视图模型的缺点和 rx java 驱动的请求。

让我们看看一些注册表单的例子。它将包含:

在反应式世界中,我将有两个具有姓名和姓氏的可观察对象,一个可观察对象将合并 3 个选择单击并将它们映射到正确的枚举,然后我可以将所有数据组合在一起,直接与我single负责在两者之间发送数据的人员进行通信我会有进度或错误的状态,然后我完成了。

这是我使用数据绑定和视图模型想到的:

class LiveDataViewModel : ViewModel() {
    enum class Choice {
        NONE, FIRST, SECOND, THIRD
    }

    private val _progressVisibilityLiveData = MutableLiveData<Boolean>()
    private val _errorLiveData = MutableLiveData<GlobalError>()

    val progressVisibilityLiveData: LiveData<Boolean> = _progressVisibilityLiveData.apply { value = false }
    val errorLiveData: LiveData<GlobalError> = _errorLiveData

    val data = LiveDataData()
    val observableData = ObservableField(LiveDataData())

    fun actionContinue() {
        _progressVisibilityLiveData.postValue(true)
        if (observableData.get()?.isValid() == false) _errorLiveData.postValue(GlobalError.AllFieldsRequired)
        else sendToApi()
    }

    private fun sendToApi() {
        // TODO there would be still an rx java call to single, when we would handle error in the same way we are doing
        // it in actionContinue
    }

    data class LiveDataData(val firstName: ObservableField<String> = ObservableField(""),
                            val secondName: ObservableField<String> = ObservableField(""),
                            val choice: ObservableField<Choice> = ObservableField(Choice.NONE)) {
        fun changeChoice(newChoice: Choice) {
            choice.set(newChoice)
        }

        fun isValid(): Boolean = !firstName.get().isNullOrEmpty() && !secondName.get().isNullOrEmpty() && choice.get() != Choice.NONE

        fun toRequest(): Request = Request(firstName.get()!!, secondName.get()!!, choice.get()!!)
    }
}

因此,我将LiveDataData使用 bindData 直接从 xml 更改我的字段,我还将根据此绑定更改选择框的状态,必须手动完成进度,然后使用数据绑定触发可见性。但这真的是处理此类案件的好方法吗?

我看到的缺点是整个逻辑actionContinue将手动更改值,来自的值ObservableProperties可能为空,所以我们要么必须处理nullable我们必须使用的任何地方的值,!!老实说我不觉得这是正确的方向。

也许你们中的任何人都想过类似的事情,如果我做出了一些错误的假设或者我根本不应该使用例如,最终可以指出我ObservableProperty。显然有大量关于数据绑定和实时数据等的文章,但我还没有找到任何可以满足我好奇心的文章。哦,MutableLiveData从表单为每个属性创建不是一种选择。

标签: androidrx-java2android-databindingandroid-livedata

解决方案


RxJava 是一个与 DataBinding 完全不同的概念。它更多的是一种处理并发的方式,而不是绑定数据。我100%认为值得学习。Android 社​​区已经张开双臂拥抱它。

无耻的插件:我不久前编译了一个 RxJava 资源列表 - http://gregloesch.com/dev/2014/10/20/resources-for-learning-rxjava-android.html


推荐阅读