前言
上篇文章中我们主要讲述了MVVM架构模式中的ViewModel应该如何去封装(《Android开发之MVVM模式实践(一):ViewModel的封装》),本篇文章将介绍Activity在MVVM中的封装。
推荐
文章将率先在公众号「码途有道」上发布,欢迎大家关注!
一、将DataBinding加入Activity的封装
Google为MVVM模式开发提供了许多不错的工具,DataBinding就是其中一员。DataBinding是Google于2015年在Android Stuido v1.3.0 版本中引入,于2016年4月在Android Studio v2.0.0 上正式支持的。DataBinding的主要作用是实现数据与xml中的UI进行绑定,让我们可以直接操控数据来改变UI的显示与状态。毫无疑问,这样的一款利器我们绝不能错过,必须将其加入封装中,实现如下:
abstract class BaseBindingActivity<B : ViewDataBinding> : AppCompatActivity(),
ViewBehavior {
protected lateinit var binding: B
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
injectDataBinding()
init(savedInstanceState)
}
protected open fun injectDataBinding() {
binding = DataBindingUtil.setContentView(this, getLayoutId())
binding.lifecycleOwner = this
}
override fun onDestroy() {
super.onDestroy()
binding.unbind()
}
protected abstract @LayoutRes
fun getLayoutId(): Int
/**
* 初始化操作
*/
protected abstract fun init(savedInstanceState: Bundle?)
}
二、将ViewModel加入Activity的封装
在上篇内容中,我们已经知道ViewModel是MVVM模式中的重要组成成员,那么ViewModel也必须与我们的Activity关联起来,实现如下:
abstract class BaseBVMActivity<B : ViewDataBinding, VM : BaseViewModel> : BaseBindingActivity<B>(),
ViewBehavior {
protected lateinit var viewModel: VM
protected fun injectViewModel() {
val vm = createViewModel()
viewModel = ViewModelProvider(this, BaseViewModel.createViewModelFactory(vm))
.get(vm::class.java)
viewModel.application = application
lifecycle.addObserver(viewModel)
}
override fun init(savedInstanceState: Bundle?) {
injectViewModel()
initialize(savedInstanceState)
initInternalObserver()
}
fun getActivityViewModel(): VM {
return viewModel
}
override fun onDestroy() {
super.onDestroy()
binding.unbind()
lifecycle.removeObserver(viewModel)
}
protected fun initInternalObserver() {
viewModel._loadingEvent.observeNonNull(this, {
showLoadingUI(it)
})
viewModel._emptyPageEvent.observeNonNull(this, {
showEmptyUI(it)
})
viewModel._toastEvent.observeNonNull(this, {
showToast(it)
})
viewModel._pageNavigationEvent.observeNonNull(this, {
navigate(it)
})
viewModel._backPressEvent.observeNullable(this, {
backPress(it)
})
viewModel._finishPageEvent.observeNullable(this, {
finishPage(it)
})
}
protected abstract fun createViewModel(): VM
/**
* 初始化操作
*/
protected abstract fun initialize(savedInstanceState: Bundle?)
}
上述代码中的BaseViewModel
和ViewBehavior
是上一篇文章《Android的MVVM架构实践(一):ViewModel的封装》中的内容,还不了解的同学可以去查看一下。
三、小结
Activity的封装并没有很复杂,主要是为了与ViewModel关联以及加入内置的Databinding。至此,我们的MVVM架构可以说已经完成了一半了。目前我们还缺少的是对同样经常使用的Fragment的封装,以及在开发中占有重要地位的网络请求的封装。下篇内容我们将介绍Fragment的封装,完整的封装代码已上传至Github,项目地址为:https://github.com/albert-lii/Fly-Android。