骚年都2020年了你还在用EventBus吗?jetpack之liveData
在说源码时简单说下liveData使用
//在app的build添加依赖
//使用liveData
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
1创建一个类实现ViewModel,定义一个方法获取liveData
/**
* liveData是个抽象类 ,可以理解为一个能感知生命周期的仓库
* mutableLIveData 是他的实现类
*/
public class MyViewModel extends ViewModel {
//注意使用static修饰 源码直接通过类获取
private static MutableLiveData<List<Bean>> mutableLiveData;
//获取仓库
public MutableLiveData<List<Bean>> getLiveData() {
if (mutableLiveData == null) {
mutableLiveData = new MutableLiveData<>();
}
return mutableLiveData;
}
}
2定义一个bean类
public class Bean {
String name;
public Bean(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3在activity中使用
订阅消息代码
//调用系统API获取 viewModel
MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
liveData = myViewModel.getLiveData();
//订阅消息
liveData.observe(this, new Observer<List<Bean>>() {
@Override
public void onChanged(List<Bean> beans) {
//数据接收
Toast.makeText(LiveDataActivity.this, "" + beans.get(0).getName(), Toast.LENGTH_SHORT).show();
}
});
发送消息代码
list.add(new Bean("张三"));
list.add(new Bean("李四"));
liveData.setValue(list);
使用很简单,那我们分析下liveData是源码时如何实现的呢?
liveData这么好,那么我们看看他的源码的核心逻辑
我们从获取ViewModel代码入口 ViewModelProviders.of(this).get(MyViewModel.class);
点击of()方法,代码很简单,获取activity的application,创建ViewModelProviders对象
点击get()方法 第一个参数:是固定自定义协议+viewModel实现类的getCanonicalName
第二个参数:viewModel实现类
点击内部的get方法,代码很简单,先从一个ViewModelStore获取ViewModel,如果有就直接返回,没有就创建,再保存到ViewmodelStore,再返回。
我们看看工厂的create()方法是如何创建ViewModel的,看到下图源码就一目了然,使用反射创建的
我们看看ViewModelStore代码,就是个HashMap保存的ViewModel封装类,源码看多,有很多类似的使用map复用的类似代码。
现在我们看看MutablLiveData的setValue()方法,点击进去,没有什么代码,那应该调用父类的setValue方法,
点击到父类的setValue方法,调用了dispatchValue方法
我们看看dispatchValue做了些什么,又调用了considerNotify()方法,在这个方法最后行代码,他实现了接口Observer的onChanged()方法
最终还是通过接口回调方式,把数据给到订阅者。
这是有人问,那liveData是如何感知感知什么周期的呢?我们点击liveData的obser方法,会发现是使用Lifecycle实现生命周期的监听。
如果对Lifecycle不了解的可以看我这篇文章https://blog.csdn.net/qq_36237165/article/details/102544785
liveData源码介绍到这,下面是我们基于liveData封装的一个库,可以实现一行代码发送消息,一行代码订阅消息,还能感知生命周期,从数据根源上防止内存泄漏。
https://blog.csdn.net/qq_36237165/article/details/104878044
喜欢的点星Thanks♪(・ω・)ノ
骚年都2020年了你还在用EventBus吗?jetpack之liveData相关推荐
- 都2020年了,还在迷信啤酒与尿布!数据分析的真相是……
一提人工智能大数据,必有人提啤酒与尿布,有意思的是,都2020年了,还有人信这个老掉牙的都市传说.今天我们系统讲解一下. 1 站在背后的关联规则 支持啤酒与尿布故事的,是关联规则算法.注意:关联规 ...
- cdialog创建后马上隐藏_都2020了,你还没用上这些Windows的“隐藏神技能”?
如今,电脑系统 的天下都被Windows和macOS给占领了,那么它们之间的较量自然是不少.关于它们谁更好用的话题从来就没断过,也从来没有什么标准答案,只能说是萝卜青菜各有所爱吧.可每次看到那些说Wi ...
- 后端开发需要学什么_都2020年了,还在纠结学什么语言?| 后端篇
几个礼拜前,一个学弟问我: "Ray,我打算之后要找工作了,不过现在自己没有特别深入的语言,最近想找一门好好学一下,你觉得学什么语言好呀?" 我表示:"这个要看你求职方向 ...
- winre drv分区干嘛用的_都2020年了,还在给硬盘分区?看完你就知道有没有必要了...
电脑硬盘,到底该不该分区? 很多人买了新电脑或者在电脑中安装了SSD硬盘之后,第一个步骤就是:开机-给硬盘分区. 但是,大家有没有考虑过,硬盘是否真的需要分区呢?这不最近有人就在程序员社区V2EX上提 ...
- css字体样式代码大全_这都2020年了,还没了解CSS?
对于新人来说想要了解css,就要从最基本的入手了解,讲真的学习css入门很简单,学习html和css短时间后你就可以制作一个网页,深入的去学习的话,就会很难.他就是从简--深--深--简的一个过程,如 ...
- 安卓源代码_都2020年了,还有人以为安卓系统是谷歌的?
阅读本文前,请您先点击上面的蓝色字体"杨观世界",再点击"关注",这样您就可以免费收到最新内容了.每天都有分享,完全是免费订阅,请放心关注. 4月8日晚,华为结 ...
- 都2020年了,别再迷信啤酒与尿布!数据分析的真相在这
一提人工智能大数据,必有人提啤酒与尿布,有意思的是,都2020年了,还有人信这个老掉牙的都市传说.今天我们系统讲解一下. 一.站在背后的关联规则 支持啤酒与尿布故事的,是关联规则算法.注意:关联规则算 ...
- 都2020年了,数据分析的真相究竟是什么?
作者:接地气的陈老师 来源:接地气学堂 一提人工智能大数据,必有人提啤酒与尿布,有意思的是,都2020年了,还有人信这个老掉牙的都市传说.今天我们系统讲解一下. 1 站在背后的关联规则 支持啤酒与尿 ...
- 2020 年,你还在使用 Java 中的 SimpleDateFormat 吗?
作者 | 阿文 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 今天我和大家一起聊一聊SimpleDateFormat ,这都2020年了,怎么还在用SimpleDateFormat ? ...
最新文章
- 斯坦福CS231 BP后向传播
- 华人首次!清华姚班助理教授张焕晨获得SIGMOD Jim Gray博士论文奖!
- 专家谈计算机体系架构研究获“图灵奖”
- 使用IntelliJ IDEA开发SpringMVC网站(一)开发环境
- mpp新增一个字段_如何快速新增百万测试数据?
- x86中的页表结构和页表项格式
- 数据处理踩过的坑(不断更新):
- 20种小技巧,玩转Google Colab
- 从Python 2切换到Python 3:您需要了解的内容
- MySQL高级-索引
- UnityWebReqest和WWW,请求web数据打包到Android手机上,报错 Unknown error记录
- java 访问iis异常_在IIS中部署应用程序时无法访问Active Directory
- 计算机程序设计在线课程,最新章节测试答案2020学堂在线计算机程序设计基础(先修课)...
- win10升级win11教程(包含TPM2.0的设置以及OfflineInsiderEnroll工具)
- PreparedStatement enum
- VC++将位图中保存的图像灰化(附源码)
- 一、回首向来萧瑟处,也无风雨也无晴
- 2022年的ISTQB,你考了没?
- Linux的基础指令
- (半成品)Excel文件按要求导出至模板excel中(含配套数据)