MutableLiveData 中 setValue() 和 postValue() 的区别

新手上路,请多包涵

有两种方法可以改变 MutableLiveData 的值。但是 setValue()postValue()MutableLiveData 之间有什么区别。

我找不到相同的文档。

这是Android的类 MutableLiveData

 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);
    }
}

原文由 Khemraj Sharma 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.8k
2 个回答

根据文档:

设置值()

设置值。如果有活跃的观察者,值将被分派给他们。必须从主线程调用此方法。

后值()

将任务发布到主线程以设置给定值。如果您在主线程执行发布的任务之前多次调用此方法,则只会分派最后一个值。

总而言之,主要区别在于:

setValue() 方法必须从主线程调用。但是如果你需要从后台线程设置一个值,应该使用 postValue()

原文由 Sagar 发布,翻译遵循 CC BY-SA 4.0 许可协议

postValue - 可以在任何地方使用

setValue - 仅来自主/UI 线程

基本上,postValue 应该只在后台线程中使用,因为它可能比 setValue 更慢,后者反应更快。

我写了一个处理这两种情况的片段:

 /**
 * Live data thread-safe set-value
 * Context: https://stackoverflow.com/a/52227632/6688493
*/
fun <T> MutableLiveData<T>.assignValue(newValue: T){

    if(Looper.myLooper() == Looper.getMainLooper()) {
        this.value = newValue
    }
    else {
        this.postValue(newValue)
    }
}

原文由 touhid udoy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题