mvvm+Livedata+Lifecycle+ViewModel基本使用

330 阅读4分钟

mvvm

Google官网mvvm示例

mvp介绍

我们在简单说下它与mvp的区别是什么。众所周知mvp简化了v层工作,将一些业务逻辑交给了presenter层,将网络请求工作交给model层,这样不仅代码的可维护性变低了,从代码阅读上来看也更加清晰,但是它有个致命的缺点就是无法感知Activity生命周期,当然如果想要实现这一功能这也不是什么难事,只要我们自己编写大量方法并进行管理它们就搞定,但这就让我们异常恼火因为它直接增加了我们的维护成本,有那时间我们喝杯咖啡不香么?

mvvm介绍

mvvm的面世解决了这一问题,我们再看下mvvm是什么样的,model层做网络请求、vm层做与v层交互、v层做UI展示,这里可能就会有疑问了,mvpmvvm对比下来不就是将presenter层换成vm层了么?也没什么区别么,这里就要使用Google大神给我们提供的一个叫做LifecycleObserver的接口,只要你实现它并且在v层进行注册那么一切问题就全都迎刃而解了,你的vm就可以感知Activity生命周期了,这样我们就可以喝杯咖啡了!

下面我们看下LifecycleObserver简单实现

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        lifecycle.addObserver(MyObserver())
    }

    override fun onResume() {
        super.onResume()
        Log.e("---------MainActivity: ","onResume")
    }

    override fun onPause() {
        super.onPause()
        Log.e("---------MainActivity: ","onPause")
    }
}
class MyObserver : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun connectListener() {
        Log.e("---------MyObserver ","ON_RESUME")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun disconnectListener() {
        Log.e("---------MyObserver ","ON_PAUSE")
    }
}

我们试着猜一下上面代码运行结果,MainActivity#onResume->MyObserver#ON_RESUME->MyObserver#ON_PAUSE->MainActivity#onPause,你说它神奇不神奇,只要你在Activity中写上lifecycle.addObserver(MyObserver())它就可以监听你的生命周期,至于实现原理我们不在本章节进行分析。

原理分析在这里

2019-12-27 15:31:33.334 27080-27080/com.air.github E/---------MainActivity: onResume
2019-12-27 15:31:33.335 27080-27080/com.air.github E/---------MyObserver: ON_RESUME
2019-12-27 15:32:03.969 27080-27080/com.air.github E/---------MyObserver: ON_PAUSE
2019-12-27 15:32:03.971 27080-27080/com.air.github E/---------MainActivity: onPause

jetpack

Jetpack在Google官方地址Jetpack架构官方示例

Jetpack主要分为基础、架构、行为、界面,这里我们着重介绍在我们设计架构中采用了哪些Jetpack库,其实我们在刚开始就已经介绍一个了,它就是Lifecycle惊不惊喜、意不意外,一不小心我们就已经学习完一个组件了,虽然我们还没阅读它的源码及刨析它的原理,但相信它的原理更加简单。

下一个主角登场LiveData

fun postValue() {
    val mutableLiveData = MutableLiveData<String>()
    mutableLiveData.observe(this, Observer {
        Log.e("---------hexl: ", it)
    })
    // 内部实现采用Handler机制
    thread { mutableLiveData.postValue("LiveData 基本使用-PostValue") }
}

是不是非常easy,其实它跟Rxjava是非常像的,甚至从某种角度来说可以说是一样,我们分析下上面的代码,
第一步:创建MutableLiveData,它的泛型就写我们要观察数据的类型,在示例中我们就简单的写成String类型;
第二步:创建观察者Observer通过observe建立关系,这里还有个参数是this,它是什么呢???我们看下源码里写的是LifecycleOwner参数类型,那我的Activity也没实现啊?为什么不报错呢?其实在androidx中Google内部已经帮我们实现了LifecycleOwner此接口;
第三步:创建子线程调用postValue发射事件;

原理分析在这里

下一个主角登场ViewModel

fun basic() {
    val myViewModel2 = ViewModelProvider(this).get(MyViewModel2::class.java)
    myViewModel2.mutableLiveData
        .observe(this, Observer {
            println("----------hexl: $it")
        })
    myViewModel2.getName()

}
class MyViewModel2 :ViewModel() {
    val mutableLiveData = MutableLiveData<String>()

    fun getName(){
        mutableLiveData.postValue("HEXL")
    }
}

这里我们主要看下ViewModelProvider(this).get(MyViewModel2::class.java)这行代码,它帮我们创建了一个extends对象的实例,其实这个实例我们是可以自己通过new的方式创建出来的,那我们为什么要使用这种方式创建呢?其实在底层它帮我们做了缓存,避免Activity屏幕旋转时重新创建该对象。

原理分析在这里