安卓架构组件实战——ViewModel+LiveData

Lifecycle、LiveData、ViewModel讲解之LiveData Lifecycle、LiveData、ViewModel介绍 在 Android 框架中定义的大多数应用组件都存在生命周期。生命周期由操作系统或进程中运行的框架代码管理。它们是 Android 运作方式的核心,应用必须遵循它们。如果不这样做,可能会引发内存泄露甚至应用崩溃。 LiveData LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知. 阅读详情

在谷歌官方提供的安卓架构组件中,有ViewModel、LiveData、Lifecycle、DataBinding等,他们共同组成了一个完整的MVVM架构,实现了视图与业务逻辑分离,并且提供友好的生命周期管理。本文不会涉及到这些组件的原理解析,百度能找到一堆的我就不重复造轮子了,直接上干货教你如何使用。

在使用这些组件之前,我们先来了解下MVVM:

一、MVVM

MVVM即 Model(数据) View(视图) ViewModel(数据视图管理器)

具体体现:

Model:bean(实体类)、网络请求相关、数据库相关
View:布局、View、Activity、Fragment 等UI相关
ViewModel:类似于MVP中的Presenter,用于从Model获取信息,传递给View进行显示,ViewModel与View是绑定在一起的,通过一定手段进行数据交互(例如LiveData)

二、LiveData+ViewModel

LiveData是可观察的数据持有者类。它具有生命周期感知功能,这意味着它能响应其他应用程序组件(例如Activity、Fragment或Service)的生命周期。这确保LiveData仅更新处于活动的生命周期状态的应用程序组件观察者。

在使用LiveData之前,你可以先去了解官方文档Lifecycle,或者查看我的博客:《安卓架构组件实战——Lifecycle》

ViewModel:用于Model层和View层数据交互的中间组件,架构组件为ViewModelUI控制器提供了帮助程序类,该类负责为UI准备数据。 ViewModel配置更改期间会自动保留对象,以便它们保存的数据可立即用于下一个Activity或Fragment实例。

View和ViewModel通过LiveData来传递消息和数据。LiveData是一个可观察的数据持有者,他可以让应用程序组件去观察LiveData中的数据是否发生改变。LiveData还会遵循应用程序组件(Activity,Fragment, Service)的生命周期状态来避免内存泄露,从而使你的APP不会消费太多的内存(LiveData具备生命周期感知。这意味着除非Activity/fragment是激活状态(onStart但是还没有onStop),要不然是不会发起回调的。当fragment调用onStop后, LiveData还会自动删除观察者)

LiveData通常和ViewModel一起使用,使用方法如下:

1.引入

//lifecycle
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
//ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-rc02"

非androidx版本:(注意编译版本28以上,引入的support库也必须是28.0.0以上的)

// Lifecycle
implementation "android.arch.lifecycle:extensions:1.1.0"
//ViewModel
implementation "android.arch.lifecycle:viewmodel:1.1.0"
//LiveData
implementation "android.arch.lifecycle:livedata:1.1.0"

LiveData 是一个抽象类,它的实现子类有 MutableLiveData ,MediatorLiveData,常用的是 MutableLiveData。

使用如下:

继承ViewModel即可(kotlin写法,使用java的童鞋请自行翻译)

/**
 * 基础的ViewModel,可以封装一些通用操作
 *
 */
abstract class BaseViewModel : ViewModel(){
}

LiveData:

class HomeViewModel : BaseViewModel() {
    //定义一个MutableLiveData,设置Value即可
    val data = MutableLiveData<String>()

    fun setData(name: String) {
           //这里可以去获取网络数据,操作数据库等
          //主线程可以使用setValue() ,异步线程使用postValue()
          data.value = name
    }
}

在Fragment监听数据变化:

class HomeFragment : BaseFragment() {

    ...省略部分代码    

    private var homeViewModel: HomeViewModel? = null

    companion object {
        fun newInstance(): HomeFragment {
            return HomeFragment()
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        //获取ViewModel实例(如果我的ViewModele需要带参数怎么办?看文章后面)
        homeViewModel = ViewModelProviders.of(this)[HomeViewModel::class.java]

        //改变数据
        homeViewModel?.setData("测试")

        //监听ViewModel里面的data的数据变化
//        homeViewModel?.data?.observe(this,Observer<String>{data->{
//        } })
        homeViewModel?.data?.observe(this, Observer {
            mProgressDialog?.hide()
            Log.i("test", it)
        })

    }
}

这样就完成了LiveData和ViewModel的集成,不用我们去关注生命周期的事,简单明了,完整的代码请看:项目源码

后记

我们刚刚发现了,在Fragment获取ViewModel实例是通过如下方式获取的:

 homeViewModel = ViewModelProviders.of(this)[HomeViewModel::class.java]

这里它会去执行HomeViewModel的无参构造函数,那么我的ViewModel构造函数带参数怎么办?

ViewModelProviders.of方法里面提供了一种方法,传入一个ViewModelProviders.Factory对象即可,具体写法:

//构造函数带参数tips
class MyViewModel(private val tips:String?) :BaseViewModel() {

    val timeData = MutableLiveData<String>()

    init {
        val timer = Timer()

        timer.schedule(object : TimerTask() {
            override fun run() {
                val dataStr = TimeUtil.dateToSecondStr(Date())
                //异步线程使用postValue(),主线程用setValue()/postValue()
                timeData.postValue(tips+dataStr)
            }
        },0,1000)
    }
    
    //构造函数带参数,需要构建一个Factory,这样就可以用
    //ViewModelProviders.of(this, MyViewModel.Factory(tips)).get(MyViewModel::class.java)执行带参数的构造函数
    class Factory(private val tips:String?) : ViewModelProvider.Factory{
        override fun <T : ViewModel?> create(modelClass: Class<T>): T {
            return MyViewModel(tips) as T
        }
    }
}

调用:

myViewModel = ViewModelProviders.of(this, MyViewModel.Factory("当前时间:")).get(MyViewModel::class.java)
        

 

ViewModel+LiveData总结 ViewMode+LiveData例子 Activity/Fragment只应关注UI,而不应关系操作逻辑,因此操作逻辑应放到Viewmodel中去 下面是我手画的数据流图: 首先有Fragment、ViewModel、Livedata这三个对象。 Fragment观察Viewmodel的Livedata数据,如果livedata的值改变会通知Frament。 ViewModel获取数据(网络、数据库),然后设置Livedata的值 Livedata的值改变就通知Fragment Fragment刷新界 阅读详情

相关推荐

Android架构组件使用详解

Android架构组件主要包括ViewModel、LiveData、Room、Paging、WorkManager等。这些组件旨在解决Android应用开发中的常见问题,如生命周期管理、数据持久化、数据加载和后台任务处理等。Android架构组件为开发者提供了一套强大的工具,以解决Android应用开发中的常见问题。通过使用ViewModel、LiveData、Room等组件,可以有效地管理生命周期、实现数据持久化和UI自动更新,从而提高应用程序的质量和可维护性。

2501_92489025的博客 331

Android架构组件ViewModel和LiveData介绍及使用

/ 创建LiveData}}}// 当MyActivity被销毁时,Framework会调用ViewModel的onCleared()}}

Venus 的博客 1938

组件化之路 - LiveData + ViewModel一知半解

近几年Jetpack组件库被广泛使用,除去Kotlin的compose等相关组件外,我们首先应该掌握的还是可兼容Java `Lifecycle、LiveData、ViewModel` 组件套 , 此篇主要记录关于LiveData和ViewModel的简单使用~ 因为一直处于小厂的舒适区中,所以除了自我驱动外,一般根本不会接触到近几年的新技术,不过该庆幸的是 “吾虽未齐头奋进,但从未落地不前”~

Android、前端、小程序、后端 1534

Android架构组件之ViewModel和LiveData

关于应用架构,Google官方现在主推MVVM架构,官方推出的JetPack库提供了一系类支持MVVM架构,其中最核心的两个类是ViewModel和LiveData。 在MVVM架构中,View通常指Activity和Fragment,主要用来根据数据渲染UI,而Model主要负责数据的获取,这里通常包含获取网络数据和本地缓存数据,而ViewModel作为View和Model的桥梁,主要负责UI数据的处理,官方提供了ViewModel类作为一种实现。LiveData作为一种可观察的数据存储类,可以很好在支

dfqin的专栏 4098

22、现代安卓应用架构:Jetpack 组件实战指南

本文详细介绍了现代安卓应用架构中 Jetpack 组件的使用,包括 ViewModel、LiveData 和数据绑定。通过一个货币转换器应用的实例,展示了如何使用这些组件来构建可靠、高效的安卓应用。遵循架构指南,分离数据处理和用户界面代码,可以减少代码量、提高可维护性和可测试性,并避免生命周期问题。

gpt4scribbler的博客 53

Voicebox本地部署:模型下载与离线模式实战指南

在本地语音处理场景中,模型下载失败和离线运行需求是开发者最常遇到的两大难题。理解语音工具的本地推理原理,关键在于掌握模型文件与程序逻辑的分离管理:模型独立下载,程序负责推理,输出留在本机。这种架构带来显著的技术价值——数据不出本地、不依赖公网、批量任务不中断。无论是语音识别转写、语音合成,还是集成到自动化脚本中,本地离线模式都能在隐私敏感或网络不稳定环境下稳定运行。对开发者而言,先解决模型文件的完整获取,再验证离线启动流程,就能绕过“无法下载模型”的常见坑。本文从环境准备、模型放置、服务启动到接口调用,提供

weixin_29048309的博客 310

Android架构组件使用和原理分析:ViewModel+LiveData

Android官方推荐的MVVM应用架构(**现在已经不是官方最推荐架构了**),主要是通过拆分View层(Activity/Fragmet)职责,简化View层的逻辑,分离View层和Model层之间的耦合的方式来实现开闭原则的目的

datian1234的博客 2097

AI+AB测试提升电商主图点击率实战指南

在电商运营中,主图点击率(CTR)是衡量商品吸引力的核心指标,直接影响转化率和订单增长。通过AI技术批量生成高质量主图素材,结合数据驱动的AB测试方法,可以显著提升点击率。AI工具如MidJourney和Stable Diffusion能够快速生成多样化视觉方案,而自动化处理流水线则确保素材规格统一。AB测试体系通过多维变量控制和流量分配策略,科学验证不同素材效果。这种方法特别适用于需要快速迭代的电商场景,某女装店铺案例显示CTR从1.2%提升至3.8%,验证了AI+数据协同优化的技术价值。

weixin_29058331的博客 298

安卓架构组件1.0:Lifecycle、LiveData、ViewModel和Room

谷歌推出了安卓架构组件1.0,一系列用于设计“健壮、可测试和可维护应用程序”的组件库。目前包含了Lifecycle、LiveData、ViewModel和Room,其他更多的组件会陆续推出。\\谷歌创建架构组件的目的是帮助“持久化数据、管理组件生命周期、编写模块化应用、处理常见错误、编写更少的重复代码”。这些主要组件如下:\\Lifecycle组件用于创建能够感知自身生命周期、能够基于自身状态调整...

weixin_33841722的博客 111

英飞凌功率MOSFET SPICE 瞬态仿真不收敛问题解决(基于TINA)

英飞凌功率MOSFET SPICE仿真容易出现不收敛问题,这个对于IGBT和SIC的管子应该是一样的,在瞬态仿真分析中,出现如下图所示的报错,Convergence problem。spice是为线性电路设计的,例如运算放大器、线性电源等,不是专门仿真开关电路的。在瞬态仿真时,仿真器是要不断迭代求解的,开关快速的跳变,容易在迭代式出现不收敛的问题。,由于时间步长减少,会消耗更多的计算机内存,如果运行多次内存消耗过大,会报“Out of memory”.解决方法是:报错工程,重启软件,内存重新计算。

miaoxiaokeji的博客 2299

LinuxCNC 源码解析:从界面开发到硬件交互的实战指南

本文深入解析LinuxCNC源码架构,从用户界面开发到硬件交互的实战指南。涵盖GTK与Tkinter界面开发、HAL硬件抽象层、G代码解析器改造及运动控制核心等关键模块,提供定制化开发技巧与性能优化方案,助力开发者高效掌握数控系统开发。

weixin_27066963的博客 190

安卓架构组件(一):ViewModel的使用

前言 ViewModel 主要是用来管理UI相关的数据的,使用它有两个优势: 1,可以使 ViewModel 以及 ViewModel 中的数据在屏幕旋转或配置更改引起的 Activity 重建时存活下来, 重建后数据可继续使用 2,可以帮助开发者轻易实现 Fragment 与 Fragment 之间, Activity 与 Fragment 之间的通讯以及共享数据,不同Fragmeng之间的数据...

智玲君 1473

gesp c++ 五级知识点

gesp c++ 五级知识点

MMD.然大大 2009

安卓架构组件(1)-App架构指导

相关文章: 【翻译】安卓架构组件(2)-添加组件到你的项目中 【翻译】安卓架构组件(3)-处理生命周期 【翻译】安卓架构组件(4)-LiveData 【翻译】安卓架构组件(5)-ViewModel 【翻译】安卓架构组件(6)-Room持久化类库 【翻译】安卓架构组件(7)-分页库 说明:今年的Google I/O大会关于安卓的部分发布了全新的类库:Architecture Component

xlhb的专栏 633

Endnote 导入参考文献的时候,格式错误太多了。et.al错误,国标GBT7714在endnote中的详细配置教程,适用于本科,硕士论文文献插入的模板

EndNote插入文献常遇到以下错误主要如下: 等、et al不分; 英文作者全名大写; 期刊名字使用了缩写(图片里没有体现;卷号、期号缺失时出现乱码,多了半个括号;页码范围略去了相同部分;没有悬挂缩进,本文全部解决,全网最细

sakura的博客 3万+

02-Redis 核心特性与数据结构详解:揭秘高性能的技术内核

本文深度拆解 Redis 高性能的技术内核:揭秘其凭“内存存储 + C 语言开发” 实现微秒级延迟、10 万 + QPS 的性能优势;详解 5 种基础数据类型(String/Hash 等)与 4 种扩展数据类型(Stream/Geospatial 等)的特性及场景;还介绍多语言支持、RDB/AOF 持久化、主从复制 / 哨兵 / 集群等高可用方案,助读者掌握 Redis 技术核心与实践逻辑。

蜗牛老师,专注编程领域 996

用 LiveData实现RecyclerView的点击事件

本文用到了:dataBinding、android架构组件 在使用RecyclerView时,点击item事件,我们通常会写一个OnItemClickListener接口,然后回调监听。在这里我们用安卓架构组件的LiveData试一下吧~ 官方 todo-mvvm-live 示例里用了一个 SingleLiveEvent (继承 MutableLiveData): /** * A li...

Cherish 7351

uboot引导vxworks--t2080调试记录

开发环境: t2080rdb, uboot2015, vxworks7.01. 《VxWorks_7_fsl_t2t4_BSP_Supplement_Guide__SR0620.pdf》描述: 实际上默认创建的vip,profile选项为none时,vip内核配置中是包含了INCLUDE_END选项的。所以在创建vip的时候最好就添加上PROFILE_DEVELOPMENT。 2. 内核参数bootargs是一些网络参数设置=> pri bootargs bootargs=memac(1,0)b109304

珂珂可爱多 2643

安卓架构组件

Lifecycles 管理您的 Activity 和 Fragment 生命周期 如何使用 来看接口 LifecycleObserver //如果实现这个 接口 需要使用注解方式来来监听生命周期的变化 GenericLifecycleObserver //如何实现这个接口 当生命周期变化 调用 onStateChanged 方法 FullLifecycleObserver //这个接口是全部的生命...

zhangguangtao1207的专栏 185

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android架构组件之ViewModel详解

ViewModel是Android架构组件之一,主要目的是为UI组件提供数据,并确保数据的持久性。它是一种设计模式,用于将UI的业务逻辑与UI组件分离,使得代码更加清晰、易于维护。ViewModel作为Android架构组件之一,具有数据持久性、简化UI组件代码和提高代码可维护性等优势。它通过观察者模式、Lifecycle感知和数据保存与恢复等机制,实现了数据的实时更新和持久化。在Android开发中,ViewModel已经成为了构建高质量应用的必备组件。

2501_92488521的博客 461

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

安卓架构设计八股文

安卓架构设计八股文

前端金牌摸鱼达人 517

Android 架构组件——kotlin相关基础知识点(进阶必备)

当你看见ViewModel这个词的时候,你可能会很容易的就联想到MVVM。但是MVVM到底是什么?简单来说,它是基于观察者模式实现的架构。在这种模式中,信息的提供者并不知道谁需要他去提供这些信息。但是对这些信息感兴趣的人会对其进行订阅,一旦信息发布,就可以获取到需要的信息。就像你订阅一个B站UP主一样,他们一更新,你就能得到通知ViewModel通过Activity的LifeCycle对象订阅Activity,以便在LifeCycleEvents发生时得到通知。.........

嘴巴吃糖了 1320

安卓架构模式

类型 创建过程 A/F 特点 缺点 建议MVC C->M+V C 分离了Model和Controller Controllder变复杂 适用简单、修改少的页面MVP V->P->M V 在MVC基础通过接口分离View和Model P和V的交互变得琐碎复杂 核心、复杂、需求变更快的页面MVVM V->VM ->M V 在MVP基础上增加DataBinding,代码量更小 XML和代码耦合 核心、复杂、需求变更快的页面。

eos-i的博客 316

新款安卓架构设计-Architecture Components介绍

架构模板篇介绍了mvp,mvi,mvvm(databinding),今天介绍的这款安卓架构框架是Google在今天5月17号推出的:Architecture Components. 它的第一版本解决如下问题: 1)自动管理activity和fragment的生命周期,从而避免资源和内存溢出问题 2)持续化java对象到sqlite数据库主要包括组成部分: 1)Lifecycle Compone

ncuboy045wsq的专栏 788

安卓项目架构浅谈

项目架构,从最初的单module代码级分包到如今的基于module的模块化演变;而单module内部代码结构,从mvc(不算是)到mvp再到结合google新出的带有生命周期的viewmodel、livedata等构建的mvvm演变。谈一谈自己的安卓项目架构经历。 从事安卓一开始便入得小公司,一路走来项目全靠自己搭建,当时一个app模块包含所有业务功能代码。app模块内部结构,分三大块,网络、u...

gdsjzb704004的博客 2790
上一篇: 安卓架构组件实战——Lifecycle
下一篇: Kotlin与DataBinding使用注意事项
程序猫King
博客等级 码龄14年 5580粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

程序猫King

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

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

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

打赏作者

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

抵扣说明:

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

余额充值