android面试之LiveData的postValue和setValue的区别与使用

devtools/2024/9/25 4:35:35/

一般我们在连续多次调用postValue时会出现只有最后一个值通知观察者返回过来,也就是说多次调用postValue时,只有最后一次调用是有效的,而setValue时每一个值的变化都会通知到观察者,也就是说每一次调用都是有效的,那么这是为什么?且看postValue的源码:

 protected void postValue(T value) {boolean postTask;synchronized (mDataLock) {postTask = mPendingData == NOT_SET;mPendingData = value;}if (!postTask) {return;}ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);}

在设置多次值的时候,比如一次设置值为0到2,第一次进这个方法的时候,mPendingData的值为NOT_SET,所以postTask的值true所以if (!postTask) {
            return;
        }

不会返回,会继续执行到 ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);这个方法,这个方法其实就是将消息放到UI线程也就是主线程的消息队列里面等待执行,实现代码如下:

  public void postToMainThread(@NonNull Runnable runnable) {if (mMainHandler == null) {synchronized (mLock) {if (mMainHandler == null) {mMainHandler = createAsync(Looper.getMainLooper());}}}//noinspection ConstantConditionsmMainHandler.post(runnable);}

那么按这个执行逻辑只有第一次postValue的时候,也就是值为0的时候,会向主线程加入一条执行消息,值为1和2时不会向主线程加入消息,但是此时的mPendingData 的值会变成2,在消息被执行时,代码如下:

 private final Runnable mPostValueRunnable = new Runnable() {@SuppressWarnings("unchecked")@Overridepublic void run() {Object newValue;synchronized (mDataLock) {newValue = mPendingData;mPendingData = NOT_SET;}setValue((T) newValue);}};

会执行第一条消息但是值为最后一个值,这也就是为啥postValue只有最后一次赋值是有效的,postValue最后还是会调用setValue,所以他们的区别就是每次setValue都是有效的而postValue只有最后一次赋值是有效的。

如果面试的时候有人问你,连续发送几条postValuehome键退到桌面再返回会收到几次通知,我想现在你肯定会回答只有最后一次通知会收到。


http://www.ppmy.cn/devtools/41011.html

相关文章

ssm123基于java web的网上书城系统的设计与实现+vue

基于java web的网上书城系统的设计与实现vue 摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,商品交易当然也不能排除在外,随着商品交易管理的不断成熟,它彻底改变了…

M-有效算法

在赛场上,脑子就两个字“二分”,一点思路都没,完全不知道二分谁,怎么二分,从哪入手。隐隐约约也知道要变换公式,可惜没坚持这个想法。脑子里全是把k分离出来,赛后看了题解才知道,应该…

MySQL创建储存过程函数

DDL CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL COMMENT 创建时间,modifyDate datetime DEFAULT NULL COMMENT 修改时间,userName varchar(30) NOT NULL COMMENT 学生名称,pwd varchar(36) DEFAULT NULL COMME…

射频识别技术初探

射频识别技术 引言RFID的构成RFID标签读写器天线中间件应用软件RFID的工作流程RFID标准ISO/IEC RFID 标准体系RFID的数据传输原理RFID的编码方式引言 射频识别技术是一种无线通信识别技术,通过无线电信号识别特定目标并读取相关数据,而无需建立专门的机械或光学接触。 无线…

蓝桥杯-线性动态规划问题背包问题进阶策略详解-奇怪的段

0奇怪的段【算法赛】 - 蓝桥云课 (lanqiao.cn) 基础dp&#xff1a; #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N1e56;typedef long long ll;ll f[N][206]; ll a[N]; ll sum[N]; ll p[206]; int n,k;int main…

安装和配置OceanBase

安装和配置OceanBase 下面是安装和配置OceanBase&#xff08;jieyiobs集群&#xff09;的步骤&#xff1a; 1. 安装YUM工具&#xff08;如果尚未安装&#xff09; yum install -y yum-utils2. 添加OceanBase仓库 为了能从OceanBase的官方源安装软件&#xff0c;需要添加它的…

【java-数据结构-栈和队列】

上篇文章&#xff0c;我们已经完成链表的收尾工作&#xff0c;从本篇文章开始&#xff0c;将进入栈和队列的学习&#xff0c;j觉得小编写的还可以的可以留个关注支持一下~话不多说&#xff0c;上正文~ 1.栈 概念&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端…

金融业办公信息系统基本要求

金融业办公信息系统基本要求 1 范围 本文件规定了金融行业办公信息系统基本要求&#xff0c;主要包含总体设计原则、功能类要求和非功能类要 求。 本文件适用于指导金融机构办公信息系统的规划、建设、运行和管理。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用而…