以前项目中虽然也使用MVVM架构,但由于整体框架不是我自己搭建的,导致我对于MVVM架构的整体还是很不熟悉,所以这次就自己搭建并实现一次MVVM架构。
MVVM架构使用的组件有viewmodel、liveData、VIEwBinding/DataBinding等,这些组件都是Jetpack库中的组件。在使用viewmodel之前要先建立四个类别的概念:
viewmodelProcider.Factory:Factory用来生成viewmodelviewmodel:持有liveData,从Repository获取数据,并向VIEw提供数据Repository:获取和处理数据,可以从网络、数据库或其他API获取并处理数据liveData:具有生命周期感知能力的可观察的数据存储器,通知VIEw展示数据下图展示了MVVM架构示意图,以及相关组件在其中的作用。
了解了MVVM的基本架构和其中各个组件的作用,可以开始代码实现了。我做这个项目的初衷是因为最近在整理收集AndroID常用的开源库,为了更方便的展示所实现的一个应用。本项目使用Bmob直接作为后台数据库,接入Bmob SDK后调用API可以直接获取数据,以此来模拟后台接口。同时本项目使用Koin作为依赖注入的框架,省去初始化viewmodel、Repository、viewmodelProcider.Factory的过程。先贴上项目目录,需要关注的是高亮显示的文件(使用Koin省去了Factory类的实现):
viewmodel类:
实现Homeviewmodel类,需要继承继承自viewmodel(),作为HomeFragment的viewmodel。Homeviewmodel类的构造参数是BmobRepository,类中有一个liveData变量用来承载数据,一个函数getAllRecommendlibrary()获取开源库数据,函数实现是repository在协程中获取云数据库中的数据:
class Homeviewmodel(private val repository: BmobRepository) : viewmodel() { var libraryRecommendData = mutablelivedata<MutableList<AndroIDlibrary>>() fun getAllRecommendlibrary() { viewmodelScope.launch { repository.getAllRecommendlibrary(libraryRecommendData) } }}
Repository类:
实现BmobRepository类,作为Homeviewmodel的数据提供方。BmobRepository类中有一个挂起函数getAllRecommendlibrary(libraryRecommendData: mutablelivedata<MutableList>)用来获取云数据库中的数据,函数的参数是liveData,在获取数据后,利用setValue通知VIEw展示数据。
class BmobRepository { /** * 获取Bmob中所有推荐开源项目 */ suspend fun getAllRecommendlibrary(libraryRecommendData: mutablelivedata<MutableList<AndroIDlibrary>>) { return withContext(dispatchers.IO) { val bombquery: Bmobquery<AndroIDlibrary> = Bmobquery() bombquery.findobjects(object : FindListener<AndroIDlibrary>() { overrIDe fun done(data: MutableList<AndroIDlibrary>?, ex: BmobException?) { if (ex == null) { Timber.d("Bmob find success") libraryRecommendData.value = data!! } else { Timber.d("Bmob exception $ex") } } }) } }}
Koin初始化:
Koin的初始化分为两步:
定义viewmodel,告诉Kioin从哪里找到viewmodel和Repository并自动生成,这里我选择直接写在BaseApplication中,需要注意的是需要定义在最外层,即和Classt同级:
在Application的onCreate()函数中初始化Koin:
class BaseApplication : Application() { overrIDe fun onCreate() { super.onCreate() //初始化Bmob Bmob.initialize(this, Constant.BMOB_APP_ID) //初始化Timber if (BuildConfig.DEBUG) { Timber.plant(Timber.DeBUGTree()) } //第二步: startKoin { //AndroID context androIDContext(this@BaseApplication) //modules val List = listof(myModule, repoModel) modules(List) } }}//第一步://定义一个myModule作为viewmodelval myModule = module { viewmodel { Homeviewmodel(get()) }}//定义一个repoModuleval repoModel = module { single { BmobRepository() }}
Fragment类实现:
实现HomeFragment类作为视图层,其中分为两步:
变量homeviewmodel作为viewmodel获取数据,使用Koin后的初始化方式十分简单
private val homeviewmodel: Homeviewmodel by viewmodel()//懒加载初始化
liveData注册监听viewmodel中的数据改变,并实现获取数据后的 *** 作
private fun initRegister() { //liveData在视图层中注册监听后,在viewmodel中的数据改变时可以持续收到数据 homeviewmodel.libraryRecommendData.observe(vIEwlifecycleOwner, { Timber.d("t $it") (binding.rvAndroIDlibrary.adapter as AndroIDlibraryAdapter).apply { data = it notifyDataSetChanged() } }) }
viewmodel调用函数通知Repository去查询数据:
overrIDe fun onResume() { super.onResume() homeviewmodel.getAllRecommendlibrary() }
自此,一个MVVM架构的应用搭建完成,第一次独立的搭建MVVM架构之后,对于MVVM架构的理解加深了不少,对于JetPack库中的组件和其它开源库也有了新的认识,此外MVVM架构还经常和Retrofit、RxJava等开源库配合使用,希望以后有机会可以再进行实践 *** 作!!
参考文章:Android MVVM 架構-使用 ViewModel、LiveData、Factory 以及 Repository
本项目源代码android_all_star_app
本项目使用开源组件库:koin、timber、permissionx、BaseRecyclerVIEwAdapterHelper
总结以上是内存溢出为你收集整理的Android MVVM架构搭建全部内容,希望文章能够帮你解决Android MVVM架构搭建所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)