ViewModel + LiveData的尝试感受

我们知道mvc->mvp是为了解决Activity臃肿冗余的问题,而mvp中会出现presenter臃肿冗余,进而出现了mvvm,进一步解耦。而在刚开始的时候提到mvvm,印象中是databinding,实际使用中发现databinding会出现问题定位困难等问题,具体见这篇文章
后来jetpack的出现,mvvm一般是使用ViewModel+LiveData实现。

使用

一、一个简单的小例子,页面中的textview实时显示计时器内容。
1、创建MyViewModel,继承ViewModel,创建存储数据对象:
Activity/Fragment中创建MyViewModel,进行关联,如下:

// 一般放在onCreate()生命周期中
myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)

创建ViewModel类:

class MyViewModel : ViewModel() {
    // 创建存储数据对象
    var text: MutableLiveData<String> = MutableLiveData()
    // 存储计时器内容
    fun setText(count: Long) {
        text.postValue(count.toString())
    }
}

创建setText数据逻辑方法,其中MutableLiveData的setValue方法只能用于主线程,postValue可用于任何线程。

2、处理计时器逻辑,计时器改变时存储计时器内容,如下:

    fun onCountDown(){
        object : CountDownTimer(1 * 60 * 1000, 1 * 1000) {
            override fun onTick(l: Long) {
                // 存储对象存储数据
                myViewModel?.setText(l/1000)
            }

            override fun onFinish() {}
        }.start()
    }

3、监听存储数据对象,数据改变时设置textview,如下:

myViewModel?.text?.observe(this, android.arch.lifecycle.Observer {
                textView?.text = it
                Log.e("xxx", "text=$it")
            })

综上,可以实现效果。
二、合并LiveData
对于实际开发中,我们可能需要监听多个存储数据对象即多个LiveData,它们发生改变时都需要更新UI操作处理,这个时候就需要合并多个LiveData去实现。
比如接上面例子,text和text2两个LiveData的值变化都会影响页面中TextView的变化
1、创建多个LiveData对象,并添加到监听数据源中,如下:

    var text: MutableLiveData<String> = MutableLiveData()
    var text2: MutableLiveData<String> = MutableLiveData()
    // 合并liveData数据源对象
    var liveDataMerger: MediatorLiveData<String> = MediatorLiveData()
    // 设置多个liveData数据源存储
    fun setMergerText() {
        liveDataMerger.addSource(text) {
            liveDataMerger.postValue(it)
        }
        liveDataMerger.addSource(text2) {
            liveDataMerger.postValue(it)
        }
    }

调用MediatorLiveData的addSource方法,分别将text和text2加到MediatorLiveData要监听的数据源中,调用postValue进行监听数据源值存储。
2、对存储多个liveData对象的MediatorLiveData进行监听,数据源发生改变时更新UI,如下:

myViewModel?.liveDataMerger?.observe(this, android.arch.lifecycle.Observer {
                textView?.text = it
                Log.e("xxx", "text=$it")
            })

这样就实现了对合并数据源进行监听更新UI功能。

感受

通过上面的小例子,可以看出来:
1、原理:
整个ViewModel+LiveData的原理,其实同Lifecycle,利用LifecycleOwner即观察者模式实现。
2、生命周期问题:
ViewModel和Activity/Fragment生命周期进行关联,退出页面的时候会调用ViewModel的onCleared方法,可以在这个方法中很方便的对数据进行清理等操作。
3、数据逻辑和View的解耦:
不使用ViewModel+LiveData的话,我们需要在相应操作点处理数据逻辑,然后调用View UI进行更新显示,每个操作点都需要调用更新UI方法。
使用ViewModel+LiveData的话,对数据的操作也就是对ViewModel中存储数据MutableLiveData的操作,增删改查等逻辑处理都会放在ViewModel中,外部只需要在相应操作点进行调用。而View UI的话,只需要通过observe对存储数据MutableLiveData进行监听,数据改变时设置UI显示。从而实现解耦,更方便复用和后期维护。

参考

https://www.jianshu.com/p/e975e71944de
https://cloud.tencent.com/developer/article/1894509

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值