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的更多相关文章

  1. Android架构组件——ViewModel

    概述 ViewModel,从字面上理解的话,它肯定是跟视图(View)以及数据(Model)相关的.正像它字面意思一样,它是负责准备和管理和UI组件(Fragment/Activity)相关的数据类, ...

  2. Jetpack架构组件学习(2)——ViewModel和Livedata使用

    要看本系列其他文章,可访问此链接Jetpack架构学习 | Stars-One的杂货小窝 原文地址:Jetpack架构组件学习(2)--ViewModel和Livedata使用 | Stars-One ...

  3. Jetpack 架构组件 Lifecycle 生命周期 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. Android官方架构组件介绍之ViewModel

    ViewModel 像Activity,Fragment这类应用组件都有自己的生命周期并且是被Android的Framework所管理的.Framework可能会根据用户的一些操作和设备的状态对Act ...

  5. Android官方架构组件介绍之ViewModel(三)

    ViewModel 像Activity,Fragment这类应用组件都有自己的生命周期并且是被Android的Framework所管理的.Framework可能会根据用户的一些操作和设备的状态对Act ...

  6. Android 架构组件 Room 介绍及使用

    关于Room Room是Google官方提供的数据库ORM框架,使用起来非常方便.Room在SQLite上提供了一个抽象层,以便在利用SQLite的全部功能的同时能更加流畅的访问数据库. Room中三 ...

  7. Android官方架构组件介绍之LifeCycle

    Google 2017 I/O开发者大会于近日召开,在开发者大会上谷歌除了发布了Android O等一些新产品之外,也对Android代码的架构做出了一个官方的回应. Google 2017 I/O开 ...

  8. Jetpack 架构组件 LiveData ViewModel MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. Android官方架构组件介绍之LifeCycle(一)

    Android官方架构组件介绍之LifeCycle 下面是官方提供的Android App开发的架构图: 从上图可以看到一些关键字:ViewModel,LiveData,Room等.其实看了上面视频的 ...

随机推荐

  1. 多测师讲解_肖sir _rf报错归纳(1):

    错误一: 报错原因:文件格式 解决方案: 修改文件格式,将txt改成robot格式   错误二: rf 运行以后出现乱码现象 解决方案: 打开python的安装路径下:C:\python37\Lib\ ...

  2. day24 Pyhton学习 反射

    一.isinstance,type,issubclass issubclass() 这个内置函数可以帮我们判断x类是否是y类的子类 issubclass(x,y) class Base: pass c ...

  3. 打印一个N*N的方阵,N为每边字符的个数( 3〈N〈20 ),写出来真是泪牛满面啊。

    本程序可以完美输出,效果如下: 相信你已经很期待代码实现了吧,其实代码真的不难,关键是思想.我说说我的想法吧,首先我构造了一个数组,保存了上面图片中字符一行的一半.聪明的你肯定看出来了,上面多数字符都 ...

  4. 扫描仪扫描文件处理-imagemagick常用参数

    -resize 宽x高(缩放,不变形) -extent 宽x高(放大,不变形)之前设置:-gravity center(重心居中) -brightness-contrast 亮度x对比度(设置亮度对比 ...

  5. linux(centos8):安装配置consul集群(consul 1.8.4 | centos 8.2.2004)

    一,什么是consul? 1,Consul 是 HashiCorp 公司推出的开源软件,用于实现分布式系统的服务发现与配置. Consul 是分布式的.高可用的. 可横向扩展的   2,官方网站: h ...

  6. PHP-fpm启动后没有查询到9000端口的问题

    Nginx与php-fpm通信的两种方式:tcp socket 和 Unix socket. Unix socket 是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信.这种方式需要再ng ...

  7. Pytest学习(一)- 入门及基础

    前言 十一也赶上自己刚出院,本想在十一放假前用假期刷完Pytest的,结果被希洛克神话吸引,再次回归毒奶粉,一直奋斗到距离上班还有两天,引导石刷没了,就没了智慧. 当然也没出过神话,结果一怒之下卸载, ...

  8. 【Azure Redis 缓存 Azure Cache For Redis】Redis性能问题,发现Server Load非常的高,导致正常连接/操作不成功

    问题描述 在正常使用Azure Redis的服务中,突然发现Redis 的CPU达到了100%, 正常的使用中发现性能问题严重.从Redis的门户图表中,观察到CPU, Connection,Lent ...

  9. mysql 必会基础1

    1.cmd --> 开启服务:net start mysql 关闭服务:net stop mysql 没有restart命令;命令格式:net stop serviceName;后面不需要加分号 ...

  10. oVirt4.4虚拟机备份方法

    红帽oVirt于今年推出了oVirt 4.4,该版本在系统.存储.网络.用户界面等方面做出增强功能与优化更新,为oVirt用户提供功能更强大.更灵活的IT基础架构.云祺科技也于最近发布了全新版本云祺容 ...