mvvm
Google官网mvvm示例。
mvp介绍
我们在简单说下它与
mvp的区别是什么。众所周知mvp简化了v层工作,将一些业务逻辑交给了presenter层,将网络请求工作交给model层,这样不仅代码的可维护性变低了,从代码阅读上来看也更加清晰,但是它有个致命的缺点就是无法感知Activity生命周期,当然如果想要实现这一功能这也不是什么难事,只要我们自己编写大量方法并进行管理它们就搞定,但这就让我们异常恼火因为它直接增加了我们的维护成本,有那时间我们喝杯咖啡不香么?
mvvm介绍
mvvm的面世解决了这一问题,我们再看下mvvm是什么样的,model层做网络请求、vm层做与v层交互、v层做UI展示,这里可能就会有疑问了,mvp跟mvvm对比下来不就是将presenter层换成vm层了么?也没什么区别么,这里就要使用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屏幕旋转时重新创建该对象。