当前位置:网站首页>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 .
边栏推荐
- 2. Basic knowledge of golang
- 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
- 居然从408改考自命题!211华北电力大学(北京)
- Unity's ASE realizes cartoon flame
- Bits and Information & integer notes
- 【搞船日记】【Shapr3D的STL格式转Gcode】
- CTFshow,信息搜集:web12
- 【服务器数据恢复】戴尔某型号服务器raid故障的数据恢复案例
- Pit avoidance: description of null values in in and not in SQL
- MySQL installation configuration 2021 in Windows Environment
猜你喜欢

2022 all open source enterprise card issuing network repair short website and other bugs_ 2022 enterprise level multi merchant card issuing platform source code

什么是数据泄露

Niuke real problem programming - Day17

Starting from 1.5, build a microservice framework link tracking traceid
使用Scrapy框架爬取网页并保存到Mysql的实现
MongoD管理数据库的方法介绍

【数字IC验证快速入门】29、SystemVerilog项目实践之AHB-SRAMC(9)(AHB-SRAMC SVTB Overview)

2. 堆排序『较难理解的排序』

CTFshow,信息搜集:web5
![[Data Mining] Visual Pattern Mining: Hog Feature + cosinus Similarity / K - means Clustering](/img/a4/7320f5d266308f6003cc27964e49f3.png)
[Data Mining] Visual Pattern Mining: Hog Feature + cosinus Similarity / K - means Clustering
随机推荐
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
[quickstart to Digital IC Validation] 20. Basic syntax for system verilog Learning 7 (Coverage Driven... Including practical exercises)
2022 all open source enterprise card issuing network repair short website and other bugs_ 2022 enterprise level multi merchant card issuing platform source code
Database exception resolution caused by large table delete data deletion
IDA pro逆向工具寻找socket server的IP和port
简述keepalived工作原理
CTFshow,信息搜集:web14
TypeScript 发布 4.8 beta 版本
Nacos一致性协议 CP/AP/JRaft/Distro协议
Oracle control file loss recovery archive mode method
Unity之ASE实现卡通火焰
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
【数据挖掘】视觉模式挖掘:Hog特征+余弦相似度/k-means聚类
Ctfshow, information collection: web4
Typescript release 4.8 beta
Ctfshow, information collection: Web3
Unity's ASE realizes cartoon flame
[quick start of Digital IC Verification] 25. AHB sramc of SystemVerilog project practice (5) (AHB key review, key points refining)
[quick start of Digital IC Verification] 19. Basic grammar of SystemVerilog learning 6 (thread internal communication... Including practical exercises)
【OBS】RTMPSockBuf_Fill, remote host closed connection.