Android開發之MVVM模式實踐(二):Activity的封裝

前言

上篇文章中我們主要講述了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: [email protected]
 * @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: [email protected]
 * @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

今後文章將同步更新在作者微信公衆號中,歡迎關注
微信公衆號:Code乾貨鋪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章