前言
上篇文章中我們主要講述了MVVM架構(gòu)模式中的ViewModel應(yīng)該如何去封裝(《Android開發(fā)之MVVM模式實(shí)踐(一):ViewModel的封裝》),本篇文章將介紹Activity在MVVM中的封裝。
推薦
文章將率先在公眾號「碼途有道」上發(fā)布捷犹,歡迎大家關(guān)注资盅!
一蚁署、將DataBinding加入Activity的封裝
Google為MVVM模式開發(fā)提供了許多不錯(cuò)的工具纤子,DataBinding就是其中一員胞此。DataBinding是Google于2015年在Android Stuido v1.3.0 版本中引入恶迈,于2016年4月在Android Studio v2.0.0 上正式支持的影锈。DataBinding的主要作用是實(shí)現(xiàn)數(shù)據(jù)與xml中的UI進(jìn)行綁定,讓我們可以直接操控?cái)?shù)據(jù)來改變UI的顯示與狀態(tài)蝉绷。毫無疑問鸭廷,這樣的一款利器我們絕不能錯(cuò)過,必須將其加入封裝中熔吗,實(shí)現(xiàn)如下:
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的封裝
在上篇內(nèi)容中,我們已經(jīng)知道ViewModel是MVVM模式中的重要組成成員桅狠,那么ViewModel也必須與我們的Activity關(guān)聯(lián)起來讼载,實(shí)現(xiàn)如下:
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架構(gòu)實(shí)踐(一):ViewModel的封裝》中的內(nèi)容,還不了解的同學(xué)可以去查看一下中跌。
三咨堤、小結(jié)
Activity的封裝并沒有很復(fù)雜,主要是為了與ViewModel關(guān)聯(lián)以及加入內(nèi)置的Databinding漩符。至此一喘,我們的MVVM架構(gòu)可以說已經(jīng)完成了一半了。目前我們還缺少的是對同樣經(jīng)常使用的Fragment的封裝,以及在開發(fā)中占有重要地位的網(wǎng)絡(luò)請求的封裝凸克。下篇內(nèi)容我們將介紹Fragment的封裝议蟆,完整的封裝代碼已上傳至Github,項(xiàng)目地址為:https://github.com/albert-lii/Fly-Android萎战。