Android MVVM架构搭建

Android从零开始搭建MVVM架构(1) **《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】** 那么在Activity设置数据和设置点击事件(意思设置了variable标签后DataBinding会自动生成get和set方法。studio3.5后只要xml写上,IDE会自动生成,低版本可能需要Make Project下)。如下就实现了一个设置数据,和设置点击事件。 通过以下代码可以看到,只要绑定下布局,通过Binding对象,可以做任何事。从此不再使用find... 阅读详情

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

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

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

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

MVVM架构图

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

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

iShot2021-04-11 19.45.41
  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<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")
                        }
                    }
                })
            }
        }
    }
    
  3. 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作为Viewmodel
      val myModule = module {
          viewModel { HomeViewModel(get()) }
      }
      //定义一个repoModule
      val repoModel = module {
          single { BmobRepository() }
      }
      
    1. 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框架搭建(一)ViewModel + LiveData + DataBinding 针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。 阅读详情

相关推荐

Android MVVM 框架搭建

MVVM 概述 谈谈对MVVM的看法 说到MVVM,不得不提MVC、MVP,前面的那对CP,在某些角度或理解上,倒挺符合他们CP的气质,毕竟他们真的太相似了,写完这三篇文章之后,会专门说说开发的时候该如何去选用这些框架。 言归正传,MVVM新引入了VM的概念,也就是ViewModel,用的时候可以继承ViewModel或者AndroidViewModel,谈到这里,不禁要想,这才是google的亲...

qq_24708503的博客 4557

Android项目实战搭建 MVVM架构

*** @description: 自定义多状态View*/= null//四种展示的view= null= null= null= null//当前视图状态) {//获取自定义属性val a =//在 XML 布局文件中的视图被加载并且所有的子视图都被添加到父视图中之后执行//展示加载页面}*///++++++++++++++++++++++++++++++++加载页面++++++++++++++++++++//动态加载并展示加载页面= null ) {

Chenyile161616的博客 1681

Android从零开始搭建MVVM架构(6) ———— 使用玩Android API带你搭建MVVM框架(初级篇

因为跟本文走,简单的MVVM会跑通。我这里就不贴demo链接了。下一篇,终结篇,将会放上终结篇demo链接。本文还涉及到的类有/**desc : Android高级进阶直播课免费学习id : 23order : 0title : Android高级进阶直播课免费学习type : 0*/return id;nt id;

2401_89820122的博客 1138

Android从零开始搭建MVVM架构(1),终于有人把安卓程序员必学知识点全整理出来了

/如果是public修饰的,直接用@Bindable@Bindable//如果是private修饰的,则在get方法使用@Bindable//只刷name字段//刷新全部字段…//省略部分代码这里我同事改变了name和color的颜色,说明继承了BaseObservable的bean对象,还可以监听刷新了哪@OverrideLog.e(“看看刷新了哪”, “刷新了name”);Log.e(“看看刷新了哪”, “全部全部”);

m0_60607371的博客 899

Android从零开始搭建MVVM架构(6)

//加载项目build.gradle的anroid标签下 dataBinding { enabled = true } 添加相关依赖 //okhttp、retrofit、rxjava implementation ‘com.squareup.okhttp3:okhttp:3.8.0’ implementation ‘com.squareup.retrofit2:retrofit:2.3.0’ implementation ‘com.squareup.retrofit2:converter-gson:2.3.

m0_66070459的博客 1877

Android开发环境搭建与MVVM架构实战指南

Android开发环境搭建是移动应用开发的基础环节,其中Android Studio作为官方IDE集成了完整的工具链。开发环境配置涉及JDK版本管理、Gradle构建系统优化以及SDK组件管理,这些要素直接影响项目的构建效率和兼容性。MVVM架构模式通过数据绑定机制实现业务逻辑与UI层的解耦,配合Jetpack组件库能够显著提升代码可维护性。在工程实践中,合理配置compileSdkVersion与targetSdkVersion对应用兼容性至关重要,而LiveData和ViewModel的组合使用则能有效

weixin_30875157的博客 310

Android 使用Google官方组件搭建 MVVM架构

Android 使用Google官方组件搭建 MVVM架构 概述 MVVM架构在MVP结构上,将Presenter改为ViewModel,使用ViewModel与View进行(DataBinding—>双向?)绑定,当ViewModel的数据发生更改,自动反映到View中显示; 反之,当View对数据更改时,ViewModel的数据也会随之变化。 View: 对应于Activity和...

李国庆的技术博客 2365

Android快速搭建MVVM框架

架构 上面是从一个开源项目中了解到的框架结构,以最简洁的方式搭建一个app的基础框架。 框架的几个特点是: 通过Jetpack的Navigation构建单Activity多Fragment结构,我们知道Activity是属于比较重的组件,而Fragment是比较轻量化的,因此这种结构对界面性能方面有很大影响 通过koin这个依赖注入框架来管理ViewModel等实例的生命周期,早期的SSH框架也是因为Spring这个依赖注入特性而更加出名 使用当前比较优秀的数据请求框架来负责各种类型数据的处理 麻雀虽小,五脏俱全,任何一个app都离不开这些基础的架构,而上面的框架搭建起来很简洁,后期维

Android使用反射机制搭建MVVM架构

Java的反射机制是指在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java的反射机制。

weixin_45911701的博客 461

从数学到机床:RTCP背后的几何变换与工业实现

本文深入解析RTCP(Rotary Tool Center Point)技术在五轴数控加工中的核心作用,通过几何变换与运动学原理实现刀尖点跟随,确保加工精度。从数学基础到工业实现,详细探讨了算法架构、机床结构适配及精度保障方法,为数控系统开发和高效加工提供关键技术支撑。

jump7的博客 258

YOLOv5+Astra Pro Plus深度相机:手把手教你实现实时目标检测(附ROS配置技巧)

本文详细介绍了如何将YOLOv5目标检测算法与Astra Pro Plus深度相机结合,构建实时目标检测系统。内容涵盖从硬件选型、环境搭建、ROS配置到YOLOv5部署与深度信息融合的完整流程,并分享了性能优化、避障算法等实战技巧,帮助开发者在机器人视觉等场景中快速实现智能感知应用。

weixin_28292761的博客 389

Android MVVM架构快速入门:5步搭建你的第一个MVVM应用

在当今的Android开发领域,MVVM架构已经成为构建可维护、可测试应用程序的黄金标准。Android MVVM架构通过清晰的关注点分离,帮助开发者构建高质量的移动应用。本文将为你提供一份完整的Android MVVM架构快速入门指南,通过5个简单步骤带你搭建第一个MVVM应用,掌握这一强大的架构模式。 ## 📱 什么是Android MVVM架构? MVVM(Model-View-Vie

gitblog_00794的博客 694

gd32 spi 发送&中断接收例程

【代码】gd32 spi 发送&中断接收例程。

weixin_43026921的博客 1653

Android从零开始搭建MVVM架构(4,android面试基础题记不住

前言 九月裸辞从长沙跑到上海,跑了一个月的面试,本月中旬终于拿到了爱奇艺的高级工程师offer。 做Android开发整4年有余,但是这一年才是最充实的,我花一年时间努力,送给了自己一个完美的蜕变! 寒冬裁员潮给我的危机感 我普通本科毕业,在长沙待了四年,其中只换过两家公司。去年这个时候,公司业绩不好要裁人。主管平时跟我关系比较好,说我本来也在被裁的考率名额中的,他帮我跟领导说了一堆好话才没事。我请主管吃了一顿火锅。 但是我无法像以前那么心安理得混日子了。因为我去年首付买了房。原本想着每个月稳定税后拿个8k

uu_5201314的博客 801

WINCC8.1工业组态软件安装与授权配置指南

SCADA系统作为工业自动化控制的核心平台,通过实时数据采集与监控实现生产流程可视化。WINCC作为西门子旗舰级组态软件,其8.1版本凭借稳定的运行时环境在汽车制造、流程工业等领域广泛应用。本文从工业控制系统软件安装规范切入,重点解析WINCC8.1与Automation License Manager的协同工作原理,详细说明包括系统环境检查、安装包校验、授权文件配置等关键技术环节。针对工程实施中常见的内存配置不足、授权管理器报错等典型问题,提供经过现场验证的解决方案,特别适用于需要进行产线监控系统升级维护

cqwf95925的博客 1654

linux内核学习(一)---内核社区介绍及补丁提交

本系列开始会对linux内核进行系统性的学习,以源码与内核社区为基础,了解前沿的内核机制,同时也深度了解linux内核中的一些经典机制 本章会先对linux内核社区进行简单的介绍,包括源码下载、内核社区的修改提交

文艺小少年的博客 536

Android从零开始搭建MVVM架构(2)————ViewModel

在真正接触并使用MVVM架构的时候,整个人都不好了。因为个人觉得,MVVM相对于MVC、MVP学习难度比较大,设计的知识点不是一点半点。所以想慢慢记录下自己的成长。如有错误希望指正。 还是那张图AAC(Android Architecture Components) 这篇我们讲ViewModel。这里我们只是简单了解和人事MVVM中的ViewModel。等把这些组件都认识后,我们再以wanA...

岩浆李的游鱼 3377

DSI3接口介绍

DSI3(distributed system interface)分布式系统接口,是一种强大且通用的总线协议,旨在将多个遥感器和执行器互连到中央控制模块。在单总线中集成了电压信号、电流信号还有电源,甚至引用了3位状态机概念(反向数据),从逻辑0/1扩展到了0/1/2。

Airer_00的博客 4344

Android从零开始搭建MVVM架构(1)————DataBinding

在真正接触并使用MVVM架构的时候,整个人都不好了。因为个人觉得,MVVM相对于MVC、MVP学习难度比较大,设计的知识点不是一点半点。所以想慢慢记录下自己的成长。如有错误希望指正。 首先看一张图,(这里就是一些人口中所说的“AAC框架”) 我说下我的理解:AAC(Android Architecture Components) :实际上是android官方提供的一系列组件,用来实现MVVM...

岩浆李的游鱼 7882

Go基础:Go语言详细介绍,环境搭建,及第一个程序详解

Go语言是Google开发的开源编程语言,具有高效、简洁、并发性强等特点。文章从Go语言的诞生背景、核心特性及应用领域展开介绍,并详细说明了Windows、Linux和macOS下的环境搭建步骤,包括安装、环境变量配置及测试方法。最后通过“Hello, World!”程序解析Go语言基本语法,并演示了编译发布和跨平台编译功能。全文涵盖了Go语言从入门到实践的完整流程,适合初学者快速上手。

数据知道的博客 6800

Arcgis中的模型构建器(ModelBuilder)技术之批量图层转KML

这段时间全省各地都在开展耕地流出图斑整改恢复工作,期间或多或少都需要村委会协助摸排举证,除了举证软件外,奥维、外业精灵等软件想必大家接触得也很多。这就经常需要我们转kmz文件给业主或者摸排人员,那么有没有什么方法在arcgis下快速批量转kmz文件呢,今天就介绍一下如何在模型构建器(ModelBuilder)构建批量图层转KML的模型。

weixin_44671081的博客 1325

Android从零开始搭建MVVM架构(6) ———— 使用玩Android API带你搭建MVVM框架(初级篇)

在经历了半个月的AAC组件的学习,终于来到了最后一步。希望本文能够帮助到你。本demo架构RxJava + Retrofit + MVVM,并且围绕玩安卓API(感谢鸿洋)带大家一起搭建我们的MVVM项目。 从零开始搭建MVVM架构系列文章(持续更新): Android从零开始搭建MVVM架构(1)————DataBinding Android从零开始搭建MVVM架构(2)————ViewMode...

岩浆李的游鱼 6610

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android从零开始搭建MVVM架构(1),kotlin扩展函数原理

使用default的时候,即使是studio3.5里,也不提示,不过不影响。还有一点,在DataBinding里,已经处理了null。所以这个时候你在Activity里给user设置为null。也不会崩溃 二、DataBinding在Fragment和RecyclerView里的使用 在Fragment的使用和Activity里的使用一样。获取根目录的方式如下。 //注意获取根布局是 View view = activityAlisBinding.getRoot(); 这里重点介绍下再recyclerVie

m0_63935228的博客 1637

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android 2018最新架构,Android面试系列文章2018之架构搭建之MVVM模式篇

Android面试系列文章2018之架构搭建之MVVM模式篇1.MVVM定义View–>对应于Activity和XML,负责View的绘制以及与用户交互。Model–>实体模式。ViewModle–>负责完成View与Model间的交互,负责业务逻辑。MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行...

weixin_42300424的博客 105

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: Glide自定义Transformation实现图片部分圆角
下一篇: Android项目引入OpenCV和FFmpeg
CheatGZ
博客等级 码龄10年 1粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CheatGZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值