骚年都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 ? ...
最新文章
- java中定义score方法_elasticsearch 自定义 script score JavaAPI查询详解
- python3 numpy. ndarray 与 list 互转方法
- SHE PWM的simulink仿真谐波分析
- escape、encodeURI 、encodeURIComponent 编码与解码
- Bash shell的内建命令:type
- 获取treeview中当前鼠标所指的节点treenode 。
- 【生活资讯】5款好用的生活学习类APP
- Exchange2010 owa 访问 http 500 内部服务器错误
- HDU 1151 Air Raid
- maven项目建立pom xml报无法解析org apache maven plugins maven resource
- (四)、Redis删除策略---Redis设计与实现读书笔记
- 其于js的五笔输入法!
- 计算机考研专业课除了408,2020贵州大学计算机专业课改考408
- 【IOS自动化解放双手系列一】unity3D导出xcode 工程并配置各种权限
- 小红书赞助和广告有什么区别,小红书赞助和广告一样吗?
- 消息推送----微信小程序,公众号
- MNL——多项Logit模型学习笔记(三)二项Logit模型、Gumble分布以及Logistic分布
- SSM拦截器和过滤器结合使用-实现登录拦截操作
- JS点击进行展开和折叠的功能代码
- 此更新不适用于您的计算机 kb4012212,2017 年 3 月发布的适用于 Windows 7 SP1 和 Windows Server 2008 R2 SP1 的纯安全质量更新...
热门文章
- 重磅 | GitHub私有仓库从此免费,微软要赢开发者的心
- 高通android逆向分析,浅谈Android高通(Qualcomm)和联发科(MTK)平台
- asp毕业设计——基于asp+access的航班在线定票系统设计与实现(毕业论文+程序源码)——航班在线定票系统
- 基于ZigBee的物联网毕业论文设计
- Android APK 反编译的基本工具和步骤
- [JAVA]文件和IO
- C语言学习(十八)大程序
- python一元二次方程表达式_Python实现求解一元二次方程的方法示例
- 微视网媒:万亿城配的变局者,罗戈网专访绿色慧联总经理杨东
- cad中怎么随意移动图形_AutoCAD2017怎么移动图形 整体拖动图纸教程