Android 架构组件-Lifecycle、LiveData、ViewModel
Lifecycle
Lifecycle组件包括LifecycleOwner、LifecleObserver,能方便监听Activity或者Fragment的生命周期。
步骤:
1.实现LifecycleObserver接口
- 实现DefaultLifecycleObserver接口,然后重写里面生命周期方法;
- 直接实现LifecycleObserver接口,然后通过注解的方式来接收生命周期的变化;
对于这两种形式,Lifecycle.java文档中是建议使用第一种方式,因为文档中说明了,随着Java8成为主流,注解的方式会被弃用。
2.添加观察者。
通过getLifecycle().addObserver(mPresenter)方法
Activity基类实现了LifecycleOwner方法,因此可以直接获取该方法。
3.监听生命周期。
注意:activity/Fragment的生命周期发生改变时,onStart、onResume方法会先被调用后,再调用Observer中重写方法,onPause/onDestory反之。
ViewModel
ViewModel是一个用来为Activity或Fragment管理数据的类,ViewModel一般用来处理Activity/Fragment和应用其他部分数据的通信。
ViewModel创建与一个作用域(Activity/Fargment)有关,只要组件不被Destory,那么Viewmodel会一直存活。viewmodel创建后会存储这个这个作用域,在activity重新恢复时,会返回已存在的viewmodel。
例如,如果作用域是一个Activity,那么Viewmodel会一直保留直到Activity生命周期结束。但是在activity横竖屏切换中,activity执行了onDestory方法,并不代表该Activity被销毁,我们可以通过isFinishing方法得知。旋转屏幕时,isFinishing为false,按下返回键时,isFinishing为true。
viewmodel的作用是管理UI的数据,不能访问UI或者持有activity/Fragment的引用。
LiveData
LiveData是一个数据持有类,具有如下特点:
1.数据可以被观察者订阅。
2.能感知组件(Fragment、Activity、Service)的生命周期。
2.只有在组件处于激活状态(STATED、RESUME)才会通知数据刷新。(除了onDestory方法为DESTORY状态,其他回调方法皆为STARTD/RESUME等)
LiveData的优点:
- 能够保证数据和UI统一
这个和LiveData采用了观察者模式有关,LiveData是被观察者,当数据有变化时会通知观察者(UI)。
- 减少内存泄漏
这是因为LiveData能够感知到组件的生命周期,当组件处于DESTROYED状态时,观察者对象会被清除掉。
- 当Activity停止时不会引起崩溃
这是因为组件处于非激活状态时,不会收到LiveData中数据变化的通知。
- 不需要额外的手动处理来响应生命周期的变化
这一点同样是因为LiveData能够感知组件的生命周期,所以就完全不需要在代码中告诉LiveData组件的生命周期状态。
- 组件和数据相关的内容能实时更新
组件在前台的时候能够实时收到数据改变的通知,这是可以理解的。当组件从后台到前台来时,LiveData能够将最新的数据通知组件,这两点就保证了组件中和数据相关的内容能够实时更新。
- 针对configuration change时,不需要额外的处理来保存数据
我们知道,当你把数据存储在组件中时,当configuration change(比如语言、屏幕方向变化)时,组件会被recreate,然而系统并不能保证你的数据能够被恢复的。当我们采用LiveData保存数据时,因为数据和组件分离了。当组件被recreate,数据还是存在LiveData中,并不会被销毁。
- 资源共享
通过继承LiveData类,然后将该类定义成单例模式,在该类封装监听一些系统属性变化,然后通知LiveData的观察者。
LiveData使用:
LiveData内部是通过Lifecycle实现监听回调的,具体可以看源码。
步骤:
1.创建保存特定数据类型的LiveData实例;
2.创建Observer对象,作为参数传入LiveData添加观察者;
3.更新LiveData对象存储数据。
1.添加依赖
//viewModel
api 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-alpha02'
//LifecycleObserver 与 LiveData
api 'androidx.lifecycle:lifecycle-extensions:2.2.0-alpha02'
2.创建LiveData实例
Android文档中建议将LiveData与ViewModel配合起来使用,当然它也可以单独使用,不过需要注意数据和组件之间的分离,LiveData一定不能持有组件的对象,否则在组件被销毁时,LiveData仍持有Activity/Fragment 对象,导致的结果是组件无法被回收。
MutableLiveData为LiveData的子类。
3.创建Observer对象,添加观察者。
在组件中创建通过LiveData.Observe()方法添加观察者,当数据变化时会通过该回调方法通知观察者,弹出吐司。
添加观察者的方式为2种:
- observe()方法:当组件生命周期发生变化时,onStateChanged()方法会被调用。组件为DESTORY状态时,会自动取消订阅。
- observeForever()方法:onStateChanged()方法会被调用三次(CREATED、STARTED、RESUMED),后面就不会收到DESTROYED的状态,需要手动取消订阅。
4.更新LiveData中的数据。
更新LiveData有2种方式,:
- setValue() :主线程中调用,如果非主线程,会抛出异常。
- postValue() :既可以在主线程也可以在子线程中调用,最终会调用setValue方法改变存储的数据。
参考链接:
1.https://blog.csdn.net/zhuzp_blog/article/details/78871374
2.https://blog.csdn.net/zhuzp_blog/article/details/78871527
3.viewmodel和LiveData的使用:
https://www.jianshu.com/p/721cdcdf11b2
Android 架构组件-Lifecycle、LiveData、ViewModel的更多相关文章
- Android架构组件——ViewModel
概述 ViewModel,从字面上理解的话,它肯定是跟视图(View)以及数据(Model)相关的.正像它字面意思一样,它是负责准备和管理和UI组件(Fragment/Activity)相关的数据类, ...
- Jetpack架构组件学习(2)——ViewModel和Livedata使用
要看本系列其他文章,可访问此链接Jetpack架构学习 | Stars-One的杂货小窝 原文地址:Jetpack架构组件学习(2)--ViewModel和Livedata使用 | Stars-One ...
- Jetpack 架构组件 Lifecycle 生命周期 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Android官方架构组件介绍之ViewModel
ViewModel 像Activity,Fragment这类应用组件都有自己的生命周期并且是被Android的Framework所管理的.Framework可能会根据用户的一些操作和设备的状态对Act ...
- Android官方架构组件介绍之ViewModel(三)
ViewModel 像Activity,Fragment这类应用组件都有自己的生命周期并且是被Android的Framework所管理的.Framework可能会根据用户的一些操作和设备的状态对Act ...
- Android 架构组件 Room 介绍及使用
关于Room Room是Google官方提供的数据库ORM框架,使用起来非常方便.Room在SQLite上提供了一个抽象层,以便在利用SQLite的全部功能的同时能更加流畅的访问数据库. Room中三 ...
- Android官方架构组件介绍之LifeCycle
Google 2017 I/O开发者大会于近日召开,在开发者大会上谷歌除了发布了Android O等一些新产品之外,也对Android代码的架构做出了一个官方的回应. Google 2017 I/O开 ...
- Jetpack 架构组件 LiveData ViewModel MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Android官方架构组件介绍之LifeCycle(一)
Android官方架构组件介绍之LifeCycle 下面是官方提供的Android App开发的架构图: 从上图可以看到一些关键字:ViewModel,LiveData,Room等.其实看了上面视频的 ...
随机推荐
- day56 Pyhton 前端Jquery08
前端 内容回顾: -BOM -jquery介绍 -jquery下载和引入方式 npm install jquery -jquery的选择器 -基本选择器 -通配符选择器 - id选择器 - 类选择器 ...
- .NetCore 异步编程 - async/await
前言: 这段时间开始用.netcore做公司项目,发现前辈搭的框架通篇运用了异步编程方式,也就是async/await方式,作为一个刚接触的小白,自然不太明白其中原理,最重要的是,这个玩意如果不明白基 ...
- Elasticsearch索引的操作,利用kibana 创建/删除一个es的索引及mapping映射
索引的创建及删除 1. 通过索引一篇文档创建了一个新的索引 .这个索引采用的是默认的配置,新的字段通过动态映射的方式被添加到类型映射. 利用Kibana提供的DevTools来执行命令,要创建一个索引 ...
- hdu6376 度度熊剪纸条-----01背包
题目:度度熊有一张纸条和一把剪刀. 纸条上依次写着 N 个数字,数字只可能是 0 或者 1. 度度熊想在纸条上剪 K 刀(每一刀只能剪在数字和数字之间),这样就形成了 K+1 段. 他 ...
- jenkins:配置密钥时报错的解决:Failed to add SSH key. Message invalid privatekey(Jenkins 2.257)
一,报错的现象: 1,提示信息: jenkins.plugins.publish_over.BapPublisherException: Failed to add SSH key. Message ...
- linux(centos8):安装jmeter5.3
一,jmeter的用途: Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试, 它最初被设计用于Web应用测试,但后来扩展到其他测试领域. Apach ...
- BeanCopier的使用
BeanCopier进行的是bean之间的copy,从一个类到另一个类,进行属性值的拷贝. 成功copy的条件: 1.属性的类型和名称都相同 2.目标类的setter缺少或缺失会导致拷贝失败,名称相同 ...
- 如何对数据进行MD5加密
前端进行加密 /** * jQuery MD5 hash algorithm function * * <code> * Calculate the md5 hash of a Strin ...
- python第二章:控制流
变成实际上是一个过程的提现,每个过程都是有多个流程块组成. 比如:判断是否下雨的过程 1.布尔值 在第一章最后举例了比较操作后,最终返回的结果 True or False True 和 False是一 ...
- 【手摸手,带你搭建前后端分离商城系统】03 整合Spring Security token 实现方案,完成主业务登录
[手摸手,带你搭建前后端分离商城系统]03 整合Spring Security token 实现方案,完成主业务登录 上节里面,我们已经将基本的前端 VUE + Element UI 整合到了一起.并 ...