Android Jetpack Components of Lifecycle 学习笔记

Android Jetpack Components of LiveData 学习笔记

Android Jetpack Components of ViewModel 学习笔记

Demo 地址:https://github.com/mengzhinan/Lifecycle_LiveData_ViewModel_demo

LiveData Google 文档:https://developer.android.google.cn/topic/libraries/architecture/livedata

环境配置:

与 Lifecycle 一样,如果是 sdk 小于 26 的版本,需要导入依赖包 android.arch.lifecycle。现在新建的项目默认都是 28 了,故不需要任何配置。

LiveData 是什么?

LiveData is an observable data holder class. Unlike a regular observable, LiveData is lifecycle-aware, meaning it respects the lifecycle of other app components, such as activities, fragments, or services. This awareness ensures LiveData only updates app component observers that are in an active lifecycle state.

LiveData 是一个可观察的数据持有者类。与常规 Observable 不同,LiveData 是生命周期感知的,这意味着它尊重其他应用程序组件的生命周期,例如 Activity,Fragment 或 Service。此感知确保 LiveData 仅更新处于活动生命周期状态的应用程序组件观察者。

简单实用:

先来一个 Demo 简述 LiveData 的使用。

public class DataUtil {private MutableLiveData<String> name = new MutableLiveData<>();public LiveData<String> getNameLiveData(){return name;}public void requestHead() {// 模拟请求网络或 DB,然后更新数据name.setValue("requestHead success");}public void requestList() {// 模拟请求网络或 DB,然后更新数据name.setValue("requestList success");}}
public class LiveDataActivity extends AppCompatActivity {private DataUtil dataUtil;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);dataUtil = new DataUtil();dataUtil.getNameLiveData().observe(this, data -> {// 得到数据更新});}@Overrideprotected void onResume() {super.onResume();dataUtil.requestHead();dataUtil.requestList();}
}

代码说明:

抱歉,Demo 代码中的命名很随意。

在 DataUtil 类中定义了一个 MutableLiveData<String> 类型的对象 name,name 是一个使用字符串类型数据的对象。

在 DataUtil 中定义了 requestHead() 和 requestList() 两个方法,用来模拟网络请求。并在其中模拟网络请求成功,同时更新 name 对象中的值。

在 LiveDataActivity 中,注意其父类是 AppCompatActivity。

在 LiveDataActivity 中创建 DataUtil 对象,并获取到其中的 LiveData 对象 name,在 name 上注册观察者。

在适当的位置,比喻页面 onResume 或 onClick,调用  DataUtil 对象的  requestHead() 或 requestList() 方法。待 name 对象中的数据有变更时,LiveDataActivity.DataUtil.MutableLiveData<String> 中注册的观察者就有收到数据变更通知。

在整个 LiveData 生命周期内,name 对象会持有一个字符串对象值。当 name 中的值发生变化时,会通知所有观察者对象。

通过上面的描述,应该能理解官方的解释了。

LiveData 优点:

1、便于使 Activity 中的 UI 逻辑和网络请求分离解耦。

2、LiveData 不会有内存泄漏的风险。

LiveData 原理简述:

上例中,为什么使用的是 MutableLiveData?

通过查看源码发现,MutableLiveData 继承 LiveData。目的是为了对外暴漏 postValue()、 setValue() 两个方法。二者的区别是 postValue() 可以在非 UI 线程中调用,然后会通过 handler 切换到 UI 线程中。

我们从 MutableLiveData 的 setValue() 方法分析,为什么 setValue() 后,数据会更新到 Activity 中的观察者中。

追索到 LiveData 的 setValue() 方法中:

@MainThread
protected void setValue(T value) {// 检查线程,如果是子线程,会直接抛异常assertMainThread("setValue");mVersion++;// 暂存数据mData = value;// 分发数据更改dispatchingValue(null);
}

追查方法 dispatchingValue(null);

private void dispatchingValue(@Nullable ObserverWrapper initiator) {if (mDispatchingValue) {mDispatchInvalidated = true;return;}mDispatchingValue = true;do {mDispatchInvalidated = false;if (initiator != null) {considerNotify(initiator);initiator = null;} else {for (Iterator<Map.Entry<Observer<T>, ObserverWrapper>> iterator =mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {considerNotify(iterator.next().getValue());if (mDispatchInvalidated) {break;}}}} while (mDispatchInvalidated);mDispatchingValue = false;}

循环所有观察者集合,逐个分发消息。追查方法 considerNotify(iterator.next().getValue());

private void considerNotify(ObserverWrapper observer) {if (!observer.mActive) {return;}// Check latest state b4 dispatch. Maybe it changed state but we didn't get the event yet.//// we still first check observer.active to keep it as the entrance for events. So even if// the observer moved to an active state, if we've not received that event, we better not// notify for a more predictable notification order.if (!observer.shouldBeActive()) {observer.activeStateChanged(false);return;}if (observer.mLastVersion >= mVersion) {return;}observer.mLastVersion = mVersion;//noinspection uncheckedobserver.mObserver.onChanged((T) mData);}

最后调用了 Observer 的 onChanged() 方法,通知到了观察者。注意 observer 能感知组件的生命周期,可以看看 ObserverWrapper 的子类 LifecycleBoundObserver。

我们在从 LiveDataActivity 中的注册观察者开始分析:

追索到 LiveData 的 observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) 方法:

@MainThreadpublic void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {if (owner.getLifecycle().getCurrentState() == DESTROYED) {// ignorereturn;}LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);if (existing != null && !existing.isAttachedTo(owner)) {throw new IllegalArgumentException("Cannot add the same observer"+ " with different lifecycles");}if (existing != null) {return;}owner.getLifecycle().addObserver(wrapper);}

传递进来的 observer 都被包装成了 LifecycleBoundObserver 类型。

注意这行代码:

owner.getLifecycle().addObserver(wrapper);

获取 owner 对象,并注册了 Lifecycle 的观察者对象。这不是上一篇文章讲的 Livecycle 内容吗?

难怪上面说 LiveData 是可以感知组件生命周期的。

至此,已经完全解释了 LiveData 数据更新的原理,以及生命周期感知的原理。

Demo 地址:https://github.com/mengzhinan/Lifecycle_LiveData_ViewModel_demo

Android Jetpack Components of LiveData 学习笔记相关推荐

  1. Android Jetpack Components of ViewModel 学习笔记

    Android Jetpack Components of Lifecycle 学习笔记 Android Jetpack Components of LiveData 学习笔记 Android Jet ...

  2. Android Jetpack组件之 LiveData使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  3. Android开源项目SlidingMenu本学习笔记(两)

    我们已经出台SlidingMenu使用:Android开源项目SlidingMenu本学习笔记(一个),接下来再深入学习下.依据滑出项的Menu切换到相应的页面 文件夹结构: 点击Bluetooth能 ...

  4. Android Architecture Components Part2:LiveData

    感谢你的再次光临,欢迎来到Android Architecture Components(ACC)系列文章.上篇文章我们一起讨论了Room,通过Room我们能够方便的操作App的数据库.如果你的App ...

  5. android spi读写不通,Android-SPI学习笔记

    概述 SPI(Service Provider Interface, 服务提供方接口),服务通常是指一个接口或者一个抽象类,服务提供方是对这个接口或者抽象类的具体实现,由第三方来实现接口提供具体的服务 ...

  6. 《Android开发高手课》学习笔记

    最近在学习张绍文老师的<Android开发高手课>课程,学习到了很多的干货,特别是在处理问题的策略和知识的广度方面给了我很多的启发,对未来的学习也提供了方向. 目前,技术的发展有两个趋势. ...

  7. Android底层HAL驱动开发学习笔记

    2017.3.27 1.确定任务:加快摄像头的信息获取速率:缩减驱动程序.减小帧的大小,缩减一个像素点的比特流(6/8/10bit) 2.重点了解函数:camerabuffer *buffer=mPr ...

  8. Android推送进阶课程学习笔记

    今天在慕课网学习了Android进阶课程推送的server端处理回执的消息 . 这集课程主要介绍了,当server往client推送消息的时候,client须要发送一个回执回来确认收到了推送消息才算一 ...

  9. Android Jetpack系列之LiveData

    文章目录 LiveData介绍 LiveData优点 LiveData使用举例 基础用法 进阶用法 Transformations.map()修改数据源 Transformations.switchM ...

最新文章

  1. java race condition_java多线程(一)Race Condition现象及产生的原因
  2. VR视觉健康标准在穗发布 专家:VR使用不要超过45分钟
  3. 智能哲学:“学习机器”与“机器学习” ——解读图灵思想中的人工智能
  4. 测试Servlet生命周期例子程序
  5. java数组螺旋矩阵从上到下_Java-基础编程(螺旋矩阵乘法表)
  6. 牛客题霸 [最长公共子序列] C++题解/答案
  7. jeesite使用心得(一)
  8. 【译】NoClassDefFoundError和ClassNotFoundException的不同
  9. mysql查询最小的id_Mysql查询表中最小可用id值的方法
  10. [NLP]基于IMDB影评情感分析之BERT实战-测试集上92.24%
  11. (转) 淘淘商城系列——解决KindEditor上传图片浏览器兼容性问题
  12. 设计素材模板|春节要来了,素材准备好了么?
  13. 关于机器学习的十个实例
  14. webots自学笔记(五)使用物理插件ODE建立铰链
  15. php识别手写图片,可识别手写字体的文字识别软件(附源码)
  16. 网页添加 Live2D 看板娘
  17. 今日头条 ANR 优化实践系列 - Barrier 导致主线程假死
  18. UVA 3713 Astronauts
  19. Scratch 游戏项目学习法 —— 接苹果(六)让苹果掉到下面
  20. shopex php5.3 无法安装,php版本导致shopex4.8.5安装的问题

热门文章

  1. 获取字符串长度、字符长度、字节长度
  2. 【元胞自动机】激进策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型matlab源码
  3. 【STK】STK11.6下载安装+MATLAB互连+各插件模块(不用再找了,这里能解决)
  4. 微信支付实名信息小程序授权接口能力
  5. 想了解工业大数据,不得不看的一篇
  6. final、finally、finally
  7. RFID-RC522中文数据手册
  8. 金庸一人,带给游戏界的千亿财富 | Mob Insight
  9. eclispe 整合的svn切换账号
  10. 2021浙江大学计算机学院研究生复试线,2021浙江大学