美文网首页Android应用开发那些事
Android开发之MVVM模式实践(二):Activity的封

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

作者: 码途有道 | 来源:发表于2020-07-05 16:31 被阅读0次

    前言

    上篇文章中我们主要讲述了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 上正式支持的。

    /**
     * @author: Albert Li
     * @contact: albertlii@163.com
     * @time: 2020/6/12 10:06 AM
     * @description: 基于MVVM模式的Activity的基类
     * @since: 1.0.0
     */
    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?)
    }
    

    结合DataBinding+ViewModel的Activity封装

    /**
     * @author: Albert Li
     * @contact: albertlii@163.com
     * @time: 2020/6/7 10:28 PM
     * @description: 基于MVVM模式的Activity的基类
     * @since: 1.0.0
     */
    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, {
                navigateTo(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的封装》中的内容

    Github传送门

    https://github.com/albert-lii/Fly-Android

    今后文章将同步更新在作者微信公众号中,欢迎关注


    微信公众号.jpg

    相关文章

      网友评论

        本文标题:Android开发之MVVM模式实践(二):Activity的封

        本文链接:https://www.haomeiwen.com/subject/zguvqktx.html