Android中的LiveData setValue vs postValue
我们在 Android 中处理大量数据。一个活动的数据正在另一个活动或片段中使用。例如,当某些数据发生变化时,我们可以更改应用程序的 UI。这里的重点是如何有效地使用数据并精确地使用 LiveData,它是 Android Jetpack 的一部分。最常用的 LiveData 方法是setvalue和postValue 。顾名思义,这两个函数非常令人困惑,因为它们似乎服务于相同的目的。然而,现实却大相径庭。
LiveData 到底是什么?
如果我们查看 Android 开发者网站对 LiveData 的定义,我们可以看到:
Simply put, LiveData is a data holder that is used to monitor changes to a specific view and then update the corresponding change.
因此,LiveData 用于简化实现 ViewModel 的任务。 LiveData 最好的部分是当你的 View 在后台时,数据不会更新;然而,当视图进入前台时,它只接收更新的数据。
LiveData 的一些好处包括:
- 没有内存泄漏。
- 视图始终接收最新数据。
- 没有因活动停止而导致的崩溃。
setValue() 和 postValue() 有什么区别?
因此,如果您熟悉 LiveData,您可能已经遇到过这两种 LiveData 方法:setValue() 和 postValue()。因此,您可能想到的一个问题是,为什么同一功能需要两个方法 setValue 和 postValue。让我们看一个例子来找出答案。假设您想使用 LiveData 来更新一个值。因此,您将有两个选择:要么更新主线程上的数据,要么更新后台线程上的数据。因此,setValue 和 postValue 的用例仅限于这两个场景。
在主线程更改数据时,使用 MutableLiveData 类的 setValue 方法,在后台线程更改 LiveData 时,使用 MutableLiveData 类的 postValue 方法
GeekTip: So, in essence, it is requesting that the main thread set the new updated value and then notify the observers.
虽然 setValue 方法用于从主线程设置更改的值,但如果有任何实时观察者附加到它,更新的值也会发送给这些观察者。主线程必须调用 setValue 方法。
// setValue
someLiveDataField.setValue("aNewValue")
someLiveDataField.setValue("sameNewValueAgain")
// postValue
someLiveDataField.postValue("aNewValue")
someLiveDataField.postValue("sameNewValueAgain")
在前面的示例中,setValue函数是从主线程调用的,而 postValue函数是从后台线程调用的。
例如,如果在主线程执行之前调用了四次postValue ,则观察者将只收到一次通知,而且最近更新的数据也是如此,因为通知被安排在主线程上执行。所以,如果你在主线程执行前多次调用 postValue 方法,最后传入的值,即最新的值将被使用,之前的所有值都将被丢弃
关于 postValue 要记住的另一件事是,如果调用 postValue 的字段没有任何观察者,然后您调用 getValue,您将不会收到您在 postValue 中设置的值,因为这里没有观察者。
差异表
setValue() | postValue() |
---|---|
The setValue is a class that holds observable data. | The postValue() requires certain observable values |
Live data is lifecycle-aware. | postValue() is not lifecycle aware. |
The postValue method’s responsibility is to post or add a task to the application’s main thread whenever the value changes | The postValue method’s responsibility is to post or add a task to the application’s main thread whenever the value changes |
The value will be updated whenever the main thread runs. | The value will be updated whenever the main thread runs later |
You cannot use setValue if you are working in a background thread | You can use postValue if you are working in a background thread |
The value is changed immediately | The value is changed after an interval |
In the case of setValue() the said value is called twice, and the value is updated twice, and the observers are notified about the updated data twice. | In the case of postValue(), the value will be updated twice, and the number of times the observers will receive the notification is determined by the main thread’s execution. |