Khe*_*raj 57 android android-livedata mutablelivedata
有两种方法可以改变价值MutableLiveData
.但是,什么是区别setValue()
与postValue()
在MutableLiveData
.
我找不到相同的文档.
这是MutableLiveData
Android 类.
package android.arch.lifecycle;
/**
* {@link LiveData} which publicly exposes {@link #setValue(T)} and {@link #postValue(T)} method.
*
* @param <T> The type of data hold by this instance
*/
@SuppressWarnings("WeakerAccess")
public class MutableLiveData<T> extends LiveData<T> {
@Override
public void postValue(T value) {
super.postValue(value);
}
@Override
public void setValue(T value) {
super.setValue(value);
}
}
Run Code Online (Sandbox Code Playgroud)
Sag*_*gar 103
根据文档:
设置值.如果有活动的观察者,则会将值分派给他们.必须从主线程调用此方法.
将任务发布到主线程以设置给定值.如果在主线程执行已发布任务之前多次调用此方法,则仅调度最后一个值.
总而言之,关键的区别在于:
setValue()
必须从主线程调用方法.但是如果需要从后台线程设置一个值,则postValue()
应该使用它.
w20*_*201 53
以上所有答案都是正确的.但是一个更重要的区别.如果您postValue()
在没有观察者的字段上调用getValue()
,之后调用,则不会收到您设置的值postValue()
.如果你在没有观察者的后台线程中工作,请小心.
Nil*_*hod 10
设置值。如果有活动的观察者,那么值将分派给他们。
必须从主线程调用此方法。
如果需要从后台线程设置值,则可以使用
postValue(Object)
将任务发布到主线程以设置给定值。
如果在主线程执行发布的任务之前多次调用此方法,则只会分派最后一个值。
这不是上述问题的直接答案。Sagar和w201的答案很棒。但是我在 ViewModels 中为 MutableLiveData 使用的一个简单的经验法则是:
private boolean isMainThread() {
return Looper.myLooper() == Looper.getMainLooper();
}
private MutableLiveData<Boolean> mutVal = new MutableLiveData<>(false);
public LiveData<Boolean> getMutVal() { return this.mutVal; }
public void setMutVal(boolean val) {
if (isMainThread()) mutVal.setValue(val);
else mutVal.postValue(val);
}
Run Code Online (Sandbox Code Playgroud)
替换mutVal
为您想要的值。
setValue()
直接从调用者线程调用,并同步通知观察者。也只能从MainThread调用它。
postValue()
使用内这样的事情new Handler(Looper.mainLooper()).post(() -> setValue())
,所以它运行setValue
通过Handler
在MainThread。也可以从任何线程调用它。
postValue - 可以在任何地方使用
setValue - 仅来自主/UI 线程
基本上,postValue 应该仅在后台线程中使用,因为它可能比反应更快的 setValue 慢。
我写了一个处理这两种情况的代码片段:
/**
* Live data thread-safe set-value
* Context: /sf/answers/3655934271/
*/
fun <T> MutableLiveData<T>.assignValue(newValue: T){
if(Looper.myLooper() == Looper.getMainLooper()) {
this.value = newValue
}
else {
this.postValue(newValue)
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23003 次 |
最近记录: |