以前项目中虽然也使用MVVM架构,但由于整体框架不是我自己搭建的,导致我对于MVVM架构的整体还是很不熟悉,所以这次就自己搭建并实现一次MVVM架构。

MVVM架构使用的组件有ViewModel、LiveData、ViewBinding/DataBinding等,这些组件都是Jetpack库中的组件。在使用ViewModel之前要先建立四个类别的概念:

  • ViewModelProcider.Factory:Factory用来生成ViewModel
  • ViewModel:持有LiveData,从Repository获取数据,并向View提供数据
  • Repository:获取和处理数据,可以从网络、数据库或其他API获取并处理数据
  • LiveData:具有生命周期感知能力的可观察的数据存储器,通知View展示数据

下图展示了MVVM架构示意图,以及相关组件在其中的作用。

了解了MVVM的基本架构和其中各个组件的作用,可以开始代码实现了。我做这个项目的初衷是因为最近在整理收集Android常用的开源库,为了更方便的展示所实现的一个应用。本项目使用Bmob直接作为后台数据库,接入Bmob SDK后调用API可以直接获取数据,以此来模拟后台接口。同时本项目使用Koin作为依赖注入的框架,省去初始化ViewModel、Repository、ViewModelProcider.Factory的过程。

先贴上项目目录,需要关注的是高亮显示的文件(使用Koin省去了Factory类的实现):

  1. 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)}}
    }
    复制代码
    
  2. Repository类:

    实现BmobRepository类,作为HomeViewModel的数据提供方。BmobRepository类中有一个挂起函数getAllRecommendLibrary(libraryRecommendData: MutableLiveData)用来获取云数据库中的数据,函数的参数是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")}}})}}
    }
  3. Koin初始化:

    Koin的初始化分为两步:

    • 定义ViewModel,告诉Kioin从哪里找到ViewModel和Repository并自动生成,这里我选择直接写在BaseApplication中,需要注意的是需要定义在最外层,即和Classt同级:

    • 在Application的onCreate()函数中初始化Koin:

      class BaseApplication : Application() {override fun onCreate() {super.onCreate()//初始化BmobBmob.initialize(this, Constant.BMOB_APP_ID)//初始化Timberif (BuildConfig.DEBUG) {Timber.plant(Timber.DebugTree())}//第二步:startKoin {//Android contextandroidContext(this@BaseApplication)//modulesval list = listOf(myModule, repoModel)modules(list)}}
      }
      //第一步:
      //定义一个myModule作为Viewmodel
      val myModule = module {viewModel { HomeViewModel(get()) }
      }
      //定义一个repoModule
      val repoModel = module {single { BmobRepository() }
      }
  4. 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 = itnotifyDataSetChanged()}})}
  • ViewModel调用函数通知Repository去查询数据:

        override fun onResume() {super.onResume()homeViewModel.getAllRecommendLibrary()}

自此,一个MVVM架构的应用搭建完成,第一次独立的搭建MVVM架构之后,对于MVVM架构的理解加深了不少,对于JetPack库中的组件和其它开源库也有了新的认识,此外MVVM架构还经常和Retrofit、RxJava等开源库配合使用,希望以后有机会可以再进行实践操作!!

最后

分享一份由几位大佬一起收录整理的 Android学习PDF+架构视频+面试文档+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料分享出来,希望可以帮助到大家提升进阶。

架构师筑基必备技能

作为系统架构师,必须成为所在开发团队的技术路线指导者;具有很强的系统思维的能力;需要从大量互相冲突的系统方法和工具中区分出哪些是有效的,哪些是无效的。架构师应当是一个成熟的、丰富的、有经验的、有良好教育的、学习快捷、善沟通和决策能力强的人。

知识要点:

  • 1、深入理解Java泛型:泛型的作用于意义;通配符与嵌套;泛型的上下边界
  • 2、注解深入浅出:注解;元注解;自定义注解;APT;插桩;反射
  • 3、并发编程:基础概念;线程之间的共享;线程间的协作;线程池的使用
  • 4、数据传输与序列化:Serializabie原理;Parcelable 的原理和使用方法;json
  • 5、Java虚拟机原理:垃圾回收;内存分配策略;Dalvik虚拟机
  • 6、高效IO:基于字节的 IO 操作;基于字符的 IO 操作;IO 常用类

设计思想解读开源框架

随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑、快速迭代的目的越来越难,插件化技术应用而生。如果没有插件化技术,美团、淘宝这些集成了大量“app”的应用,可能会有几个g那么大。

知识要点:

  • 1、热修复设计
  • 2、插件化框架设计
  • 3、组件化框架设计
  • 4、图片加载框架
  • 5、网络访问框架设计
  • 6、RXJava响应式编程框架设计
  • 7、IOC 架构设计
  • 8、Android 架构组件 Jetpack

360°全方位性能调优

在不同层次的开发工程师手里,因为技术水平的参差不齐,即使很多手机在跑分软件性能非常高,打开应用依然存在卡顿现象。

另外,随着产品内容迭代,功能越来越复杂,UI页面也越来越丰富,也成为流畅运行的一种阻碍。综上所述,对APP进行性能优化已成为开发者该有的一种综合素质,也是开发者能够完成高质量应用程序作品的保证。

  • 启动速度

  • 流畅度

  • 抖音在APK包大小资源优化的实践

  • 优酷响应式布局技术全解析

  • 网络优化

  • 手机淘宝双十一性能优化项目揭秘

  • 高德APP全链路源码依赖分析

  • 彻底干掉OOM的实战经验分享

  • 微信Android终端内存优化实践

  • Android框架体系架构
    Android框架体系架构(高级UI+FrameWork源码) 这块知识是现今使用者最多的,我们称之Android2013~2016年的技术。

Android开发者也往往因为网上Copy代码习惯了而导致对这块经常“使用”的代码熟悉而又陌生:熟悉的是几乎天天在和它们打交道, 天天在复制这些代码 ;陌生的是虽然天天和这些代码打交道,但是并没有深入研究过这些代码的原理,代码深处的内涵。

本篇知识要点:

  • 1、高级UI晋升
  • 2、Android内核组件
  • 3、大型项目必备IPC
  • 4、数据持久与序列化
  • 5、Framework内核解析

  • NDK模块开发(音视频系列)
    NDK(Native Development Kit缩写)一种基于原生程序接口的软件开发工具包,可以让您在 Android 应用中利用 C 和 C++ 代码的工具。通过此工具开发的程序直接在本地运行,而不是虚拟机。

在Android中,NDK是一系列工具的集合,主要用于扩展Android SDK。NDK提供了一系列的工具可以帮助开发者快速的开发C或C++的动态库,并能自动将so和Java应用一起打包成apk。

  • 本篇知识要点:
  • 1、NDK开发之C/C++入门
  • 2、JNI模块开发
  • 3、Linux编程
  • 4、底层图片处理
  • 5、音视频开发
  • 6、机器学习

  • Flutter学习进阶
    2019 年无疑是 Flutter 技术如火如荼发展的一年。

每一个移动开发者都在为 Flutter 带来的“快速开发、富有表现力和灵活的 UI、原生性能”的特色和理念而痴狂,从超级 App 到独立应用,从纯 Flutter 到混合栈,开发者们在不同的场景下乐此不疲的探索和应用着 Flutter 技术,也在面临着各种各样不同的挑战。

本篇知识要点:

  • 1、Flutter跨平台开发概述
  • 2、Windows中Flutter开发环境搭建
  • 3、编写你的第一个Flutter APP
  • 4、Flutter Dart语言系统入门

微信小程序开发
微信小程序作为现在比较火的编程开发应用场景之一,深受市场的青睐,这让不少开发者眼馋不已。但是对于初学者来说,就完全摸不着头脑了,不知道微信小程序开发制作需要学习那些知识,有需要的朋友可以参考本篇。

本篇知识要点:

  • 1、小程序概述及入门
  • 2、小程序UI开发
  • 3、API操作
  • 4、购物商场项目实战

Android相关源码解读
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

以上完整学习笔记pdf全部免费分享,需要的朋友只需要点赞支持一下后,【点击这里直达免费获取方式

Android MVVM 架构应用实现相关推荐

  1. Android MVVM架构

    1.MVC,MVP,MVVVM 1.1什么是MVVM 1.MVVM,是Model-View-ViewModel的简写,是M-V-VM三部分组成.它本质上就是MVC 的改进 版.MVVM 就是将其中的V ...

  2. Android MVVM架构设计模式,从DataBinding开始

    MVVM在android端已经出了很久了,但是还是比较少使用到,现在写Android架构设计的时候比较多使用的是MVP,以前在用Angularjs和Vue接触过双向数据绑定的使用和思想,所以看到MVV ...

  3. android mvvm架构-基于Jetpack

    2020年最新最实用的android-MVVM框架 https://github.com/VcStrong/JetpackMVVM.git 注册的密码规则是数字加字母超过8位即可 测试账号:13126 ...

  4. android组件化架构 书,Android MVVM组件化架构方案

    MVVMHabitComponent 关于Android的组件化,相信大家并不陌生,网上谈论组件化的文章,多如过江之鲫,然而一篇基于MVVM模式的组件化方案却很少.结合自身的调研和探索,在此分享一篇基 ...

  5. android mvvm livedata_再谈Android应用架构——Jetpack VS 生命周期

    前面我们对MVC.MVP.MVVM进行了详尽的分析,但还有一个问题悬而未决,那就是生命周期.在Android平台上生命周期具有十分重要的意义,因此这也是架构必须考虑的因素之一.生命周期处理不好很容易发 ...

  6. 《Android构建MVVM》系列(一) 之 MVVM架构快速入门

    前言 本文属于<Android构建MVVM>系列开篇,共六个篇章,详见目录树. 该系列文章旨在为Android的开发者入门MVVM架构,掌握其基本开发模式. 辅以讲解Android Arc ...

  7. android数据流分类,【Android工程之类】1 MVVM架构 - MVVM与单向数据流

    前言 这个系列将讲述使用MVVM架构.LiveData.Room.Kodein.Retrofit.EventBus来建立一个统一的.优雅的.可维护的TODO程序,本系列分为多个章节,从0开始一步一步引 ...

  8. Android的MVVM架构的单Activity应用实践

    前言 谈Android架构大家很容易想到MVC.MVP和MVVM. 1.MVC 首先分析一下上面各层之前对应的Android代码,layout.xml里面的xml文件就对应于MVC的view层,里面都 ...

  9. 一个 Android MVVM 组件化架构框架

    模块 app: app壳 工程,是依赖所有组件的壳,该模块不应该包含任何代码,它只作为一个空壳存在,由于项目中使用了EventBusAPT技术,需要索引到各业务组件的对应的APT生成类,所以在 app ...

最新文章

  1. ArcGIS JS API加载GeoServer发布的WFS服务
  2. Deep Learning for Chatbots, Part 2 – Implementing a Retrieval-Based Model in Tensorflow
  3. k8s常用对象图示:Deployment、ReplicaSet、Pod它们的关系
  4. php 跨域web访问权限,php:跨域 Web程序 - 贪吃蛇学院-专业IT技术平台
  5. input子系统基础之按键2——input设备应用层编程实践
  6. c语言音像店程序,音像店管理程序_C 课程设计.pdf
  7. 均方根误差有没有单位_1千万年仅误差一秒,这台钟直接影响北斗卫星的导航定位精度...
  8. AM5728通过GPMC接口与FPGA高速数据通信实现
  9. 把图标变成圆形的html_3组24个CSS3分享图标,可旋转和悬停
  10. powershell玩转ExcelCSV(一)
  11. Linux:查看磁盘空间占用情况
  12. 有关嵌入式、单片机、51单片机、STM32、的一些概念详解
  13. PASCAL VOC2012数据集介绍与制作自己的数据集
  14. 恩智浦半导体推出近距离非接触式读卡器IC CLRC663
  15. Fedora9虚拟机下与windows共享文件
  16. Markdown的下载与应用
  17. 在线免费学习java资源推荐
  18. python修改误差棒的样式_matplotlib可视化番外篇bar()--带误差棒的柱状图
  19. h5封装去底部_贪婪洞窟H5:也出微信小游戏了!还是原来贪婪的味道
  20. 宏基因组分析步骤Linux,宏基因组分析专题研讨班

热门文章

  1. 简单几段python代码_如何用python跑一段鸿蒙最简单代码?
  2. jdk自带压测工具_FULL GC分析过程分享
  3. atlas mysql 数据库同步_Atlas实现数据库读写分离
  4. Java构造函数的使用_java中构造函数的使用方法
  5. vscode安装本地服务器_如何用本地的VSCode连接极链AI的GPU服务器
  6. Linux系统介绍(二)文件系统结构
  7. rpm包安装和卸载,rpm查询,yum工具详解,yum仓库搭建
  8. 常见的和端口,IP相关的企业面试题
  9. 当当网首页——JS代码
  10. 【framework】spring3-mvc实例-信息转换