Android开发之MVVM模式实践(二):Activity的封装

前言

上篇文章中我们主要讲述了MVVM架构模式中的ViewModel应该如何去封装(《Android开发之MVVM模式实践(一):ViewModel的封装》),本篇文章将介绍ActivityMVVM中的封装。

推荐

文章将率先在公众号「Code满满」与个人博客「李益的小站」上发布,欢迎大家关注!

一、将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的封装

在上篇内容中,我们已经知道ViewModelMVVM模式中的重要组成成员,那么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?)
}

上述代码中的BaseViewModelViewBehavior是上一篇文章《Android的MVVM架构实践(一):ViewModel的封装》中的内容,还不了解的同学可以去查看一下。

三、小结

Activity的封装并没有很复杂,主要是为了与ViewModel关联以及加入内置的Databinding。至此,我们的MVVM架构可以说已经完成了一半了。目前我们还缺少的是对同样经常使用的Fragment的封装,以及在开发中占有重要地位的网络请求的封装。下篇内容我们将介绍Fragment的封装,完整的封装代码已上传至Github,项目地址为:https://github.com/albert-lii/Fly-Android

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页