初识LiveData
来源:互联网 发布:金勃良知乎 编辑:程序博客网 时间:2024/06/08 08:41
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 unchecked setValue((T) newValue); }
mPendingData = NOT_SET;
对,就是这时候postValue(T value)
重新有效了,所以循环postValue(T value)
的效果是每几个调用只有一个有效,上一个调度完成才会产生下一个,并不会堆叠。
- 初识LiveData
- LiveData
- android LiveData
- LiveData的学习
- 初探Architecture Components之LiveData
- Android Architecture Component之LiveData
- Android LiveData简介(一)
- Android架构组件之LiveData
- ObjectBox[七] 支持LiveData(Android体系结构组件)
- Architecture Components之LiveData的扩展
- 谷歌官方Android应用架构库——LiveData
- 谷歌官方Android应用架构库——LiveData
- Android架构组件(二)——LiveData
- 初识
- 初识
- 初识
- [译]Android架构组件 – 查看Room和LiveData – 第一部分
- Android Architecture Components应用架构组件源码详解(基于1.0以上)(第二篇ViewModel和LiveData)
- Git仓库的创建和回退
- npm安装包失败的解决
- 简单了解HTML
- 启动服务器时执行Servlet init方法
- CommonJs、AMD和CMD相同点与区别,前端模块化
- 初识LiveData
- 学习回顾算法(冒泡排序)
- 解决AndroidStudio导入项目在 Building gradle project info 一直卡住
- Asp.net Module原理
- APP弱网络条件下,体验优化之道
- 第13章 守护进程和inetd超级服务器
- phpmydamin导入数据库大小限制修改
- Python学习_我该怎么操作最基本的加减乘除运算
- 产值翻倍