当前位置:网站首页>Android -- jetpack: the difference between livedata setValue and postvalue
Android -- jetpack: the difference between livedata setValue and postvalue
2022-07-07 15:36:00 【Liang and Android】
The content of the article comes from :https://blog.csdn.net/catzifeng/article/details/103931517
Andriod — JetPack : First time to know JetPack
Andriod — JetPack :LifeCycle The birth of
Andriod — JetPack :ViewModel The birth of
Andriod — JetPack :BaseObservable And ObservableField Two way binding
Andriod — JetPack :DataBinding + LiveData +ViewModel Simple example
Andriod — JetPack :Room Additions and deletions
Andriod — JetPack :Room + ViewModel + LiveData Add, delete, change and check the examples
Andriod — JetPack :LiveData setValue and postValue The difference between
Usually we use LiveData When , When data needs to be updated ,LiveData There are two ways to update data :
- setValue(T value)
- postValue(T value)
So what's the difference between the two ways ?
Conclusion
setValue() Can only be called in main thread ,postValue() Can be invoked in any thread. .
setValue()
Let's not rush to look at the source code , First, let's see how the official introduces this method .
/** * Sets the value. If there are active observers, the value will be dispatched to them. * <p> * This method must be called from the main thread. If you need set a value from a background * thread, you can use {@link #postValue(Object)} * * @param value The new value */
@MainThread
protected void setValue(T value)
The notes above are very clear :
This method must be invoked in the main thread. , If you need to set it in the background thread value, Please move #postValue(Object)
What's more, they used one @MainThread The notes of remind you , Next, look at the source code :
protected void setValue(T value) {
assertMainThread("setValue"); //1
mVersion++; //2
mData = value; //3
dispatchingValue(null); //4
}
private static void assertMainThread(String methodName) {
if (!ArchTaskExecutor.getInstance().isMainThread()) {
throw new IllegalStateException("Cannot invoke " + methodName + " on a background"
+ " thread");
}
}
First call assertMainThread() Method to determine whether the current thread is the main thread ( Here he passed a ArchTaskExecutor Singleton class ), If it's not the main thread , Throw exceptions directly to remind programmers .
If the method is invoked in the main thread , Add one by yourself version, It is clear that the value has changed .
Then save the new value .
to update value( This method cannot be dragged down , Pull it down to LiveData Source code analysis of ).
postValue
Let's continue to take a look at the official right postValue() Introduction to :
/** * Posts a task to a main thread to set the given value. So if you have a following code * executed in the main thread: * <pre class="prettyprint"> * liveData.postValue("a"); * liveData.setValue("b"); * </pre> * The value "b" would be set at first and later the main thread would override it with * the value "a". * <p> * If you called this method multiple times before a main thread executed a posted task, only * the last value would be dispatched. * * @param value The new value */
protected void postValue(T value)
Which translates as :
Through the mission (Runnable) Update data in the main thread .
If... Is called at the same time .postValue(“a”) and .setValue(“b”), It must be worth b By value a Cover .
If you call more than once .postValue(), Only the last value can be distributed (onChanged() Called ).
Look at the detailed source code :
protected void postValue(T value) {
boolean postTask; //1
synchronized (mDataLock) {
//2
postTask = mPendingData == NOT_SET; //3
mPendingData = value; //3
}
if (!postTask) {
return;
}
ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable); //4
}
Define a postTask Boolean value , Determine whether to update .
Add a synchrolock , Because there may be multiple child threads calling at the same time .postValue() The situation of .
By judging whether the updated value has changed postTask assignment , And will value Assign a value to mPendingData(mPendingData == NOT_SET The first time must be back true, Then they all return false, Then it will be called immediately before the value is updated mPendingData=NOT_SET, That's why multiple calls postValue() Reason why only the last value is valid ).
adopt ArchTaskExecutor updated , Pass method and parameter name , We can guess what this step has done :ArchTaskExecutor Will a Runnable Object to execute in the main thread , that mPostValueRunnable The execution environment must be the main thread , Let's take a look at mPostValueRunnable What has been done .
Because now the thread has switched to the main thread , So he just called setValue()
Last
There are several times in the text ArchTaskExecutor This thing , This class is actually postValue The key to switch to the main thread update is that its specific source code implementation is very simple , Directly used Handler The mechanism of .
边栏推荐
- With 8 modules and 40 thinking models, you can break the shackles of thinking and meet the thinking needs of different stages and scenes of your work. Collect it quickly and learn it slowly
- [deep learning] semantic segmentation experiment: UNET network /msrc2 dataset
- [quick start of Digital IC Verification] 23. AHB sramc of SystemVerilog project practice (3) (basic points of AHB protocol)
- Implementation of crawling web pages and saving them to MySQL using the scrapy framework
- 【深度学习】语义分割实验:Unet网络/MSRC2数据集
- 【OBS】RTMPSockBuf_ Fill, remote host closed connection.
- CTFshow,信息搜集:web7
- 使用cpolar建立一个商业网站(2)
- Niuke real problem programming - Day11
- 【数据挖掘】视觉模式挖掘:Hog特征+余弦相似度/k-means聚类
猜你喜欢
[Data Mining] Visual Pattern Mining: Hog Feature + cosinus Similarity / K - means Clustering
CTFshow,信息搜集:web2
MySQL bit类型解析
Ctfshow, information collection: Web3
Bye, Dachang! I'm going to the factory today
【数字IC验证快速入门】26、SystemVerilog项目实践之AHB-SRAMC(6)(APB协议基本要点)
【数据挖掘】视觉模式挖掘:Hog特征+余弦相似度/k-means聚类
[quick start of Digital IC Verification] 23. AHB sramc of SystemVerilog project practice (3) (basic points of AHB protocol)
Niuke real problem programming - day13
银行需要搭建智能客服模块的中台能力,驱动全场景智能客服务升级
随机推荐
居然从408改考自命题!211华北电力大学(北京)
【跟着江科大学Stm32】STM32F103C8T6_PWM控制直流电机_代码
Niuke real problem programming - Day11
Novel Slot Detection: A Benchmark for Discovering Unknown Slot Types in the Dialogue System
Nacos conformance protocol cp/ap/jraft/distro protocol
Win10 or win11 taskbar, automatically hidden and transparent
MySQL bit type resolution
CTFshow,信息搜集:web2
Niuke real problem programming - day20
Unity之ASE实现全屏风沙效果
Oracle控制文件丢失恢复归档模式方法
Niuke real problem programming - Day17
CTFshow,信息搜集:web5
Starting from 1.5, build a microservice framework link tracking traceid
数学建模——什么是数学建模
Excerpted words
Unity's ASE achieves full screen sand blowing effect
Stm32f103c8t6 PWM drive steering gear (sg90)
银行需要搭建智能客服模块的中台能力,驱动全场景智能客服务升级
CTFshow,信息搜集:web10