初识LiveData
Architecture Components
推出1.0稳定版后直接让SupportActivity
实现了LifecycleOwner
接口,不需要我们先以前一样继承LivecycleActivity
了,只要是SupportActivity
的子类都是一个LifecycleOwner
了
public class SupportActivity extends Activity implements LifecycleOwner {//...
}
几个特性
1.如果liveData
中已经持有数据,那么 后面添加进来的observer
会立即触发onChange(T t)
方法,把前面的数据发送出去
public interface Observer<T> {void onChanged(@Nullable T t);
}
2.设置数据的如下两种方式
protected void postValue(T value) {//....}
protected void setValue(T value) {//....}
setValue(T value)
要求在Ui线程中调用,如果在子线程调用会报错。在子线程需要更新数据的话要调用postValue(T value)
,其实这个方法实际上也是调用了setValue
方法的
protected void postValue(T value) {//...ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);}
可以看到,在最后他将一个Runnable
调度到主线程去执行,mPostValueRunnable
如下
public void run() {//...setValue((T) newValue);}
postValue(T value)
内部切换线程就一定会增加延迟,所以就印证文档中说的,在主线程执行如下代码,liveData
中的数据会先变为b
然后变为a
liveData.postValue("a");
liveData.setValue("b");
那么照上面所说,postValue(T value)
有一定延迟的话,短时间内一直触发该方法会不会造成任务堆叠呢?我们再来看一看源码
protected void postValue(T value) {boolean postTask;synchronized (mDataLock) {postTask = mPendingData == NOT_SET;mPendingData = value;}if (!postTask) {return;}ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);}
看以看出,postTask
为假即 mPendingData != NOT_SET
时就不会产生新的调度了,NOT_SET
就是一个Object
,而mPendingData
在初始化时赋值为NOT_SET
//初始化
private static final Object NOT_SET = new Object();
private volatile Object mPendingData = NOT_SET;
在调用postValue
后mPendingData
就已经不是NOT_SET
了,因此如果一直调用postValue
的话是不会产生任务堆叠的。那什么时候postValue
才重新有效呢?再来看看被调度的Runnable
public void run() {Object newValue;synchronized (mDataLock) {newValue = mPendingData;mPendingData = NOT_SET;}//noinspection uncheckedsetValue((T) newValue);}
mPendingData = NOT_SET;
对,就是这时候postValue(T value)
重新有效了,所以循环postValue(T value)
的效果是每几个调用只有一个有效,上一个调度完成才会产生下一个,并不会堆叠。
初识LiveData相关推荐
- Android LiveData初识
LiveData初识 LiveData is an observable data holder class. Unlike a regular observable, LiveData is lif ...
- 关于善恶,好坏的相对论:慈不带兵,义不经商,情不立事,善不为官。
一 我们都知道:慈不带兵.义不经商,但是很少有人知道下半句是什么! 我们先看上半句的意思吧: 1:仁慈的人为什么不适合带兵打仗? 身为将领,一旦仁慈心软,表面上看好像会避免很多战争,让很多百姓免于战火 ...
- Andriod --- JetPack (七):Room + ViewModel + LiveData 增删改查实例
1.Andriod - JetPack (一):初识 JetPack 2.Andriod - JetPack (二):LifeCycle 的诞生 3.Andriod - JetPack (三):Vie ...
- Andriod --- JetPack (五):DataBinding + LiveData +ViewModel 简单实例
1.Andriod - JetPack (一):初识 JetPack 2.Andriod - JetPack (二):LifeCycle 的诞生 3.Andriod - JetPack (三):Vie ...
- Andriod --- JetPack (一):初识 JetPack
1. Andriod --- JetPack (一):初识 JetPack 2. Andriod --- JetPack (二):LifeCycle 的诞生 3. Andriod --- JetPac ...
- day3----编码-集合-深浅copy-文件操作-函数初识
day3----编码-集合-深浅copy-文件操作-函数初识 本文档主要内容: 一 编码 二 集合 三 深浅copy 四 文件操作 五 函数初识 首先,我们来看看两个字符串的比较 打开cmd,进入do ...
- ⑥python模块初识、pyc和PyCodeObject
一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...
- 初识java类的接口实现
初识java类的接口实现 如果两个类之间不存在继承关系,且两个类都想实现同一个接口,两个类都必须实现接口中全部方法,否则报语法错误 如果两个类之间存在继承关系也想实现同一个接口,父类如果实现了某个接口 ...
- vba 编辑combobox内容_初识Visual Basic编辑器并建立一段简单的代码
大家好,从今日开始我正式推出"VBA之EXCEL应用"教程,这个教程是面向初学人员的教程,教程一共三册,十七个章节,从简单的录制宏实现一直讲到窗体的搭建,都是我们在利用EXCEL工 ...
最新文章
- 基于运动信息的物体检测(背景差分法、帧间差分法和光流法)。
- 矢量图面层和线层相交得到相交后的线层文件(gis相交)
- java匿名内部类举例和内部类举例
- 无心剑中译雪莱诗14首
- linux下补丁制作及打补丁实例
- Python程序提示出现File stdin,line 1错误解决方法
- NSURLSession访问HTTPS网站
- socket 接收和发送缓冲区
- 做人要有一颗健康的心
- 小游戏学习--获取已发布微信小游戏源码 creator cocos 编译出微信平台代码 喵喵切水果 跑酷
- SCC1传输请求(同系统跨Client)
- 世界很大,一定要出去看看
- java compile_java中compile函数用法
- 回首2017,展望2018
- 计算机硬盘对考,台式机怎样让进行硬盘对拷(快速批量装机) 台式机让进行硬盘对拷(快速批量装机)的方法...
- 腾讯2019秋招--小q爬塔(dp)
- 编写并调用平均值函数
- 电机控制要点解疑:SPWM,SVPWM和矢量控制
- 小波变换比傅里叶变换好在哪里_小波变换与傅里叶变换详解——代码下载——非平稳信号与平稳信号的滤波效果对比
- matlab自学笔记一(台大郭彦甫)
热门文章
- 移动机器人中的现代控制理论之状态空间表达式
- c++ - 第8节 - string类
- 「Python 网络自动化」目录汇总
- java web中文件类型,java web项目文件上传中常见的mime类型/文件类型校验、验证/只允许特定类型的文件(基于Apache的tika)...
- Variable和Tensor的区别
- CorelDRAW X6低价再次冲破底线
- Android之window机制token验证
- 数据与智能融合,新赛道的投资机会如何判断?
- E6终极备忘:修复IE6下_25+_Bugs
- 嵌入式软件架构设计-状态机