📜  Android中的LiveData setValue vs postValue

📅  最后修改于: 2022-05-13 01:58:44.587000             🧑  作者: Mango

Android中的LiveData setValue vs postValue

我们在 Android 中处理大量数据。一个活动的数据正在另一个活动或片段中使用。例如,当某些数据发生变化时,我们可以更改应用程序的 UI。这里的重点是如何有效地使用数据并精确地使用 LiveData,它是 Android Jetpack 的一部分。最常用的 LiveData 方法是setvaluepostValue 。顾名思义,这两个函数非常令人困惑,因为它们似乎服务于相同的目的。然而,现实却大相径庭。

LiveData 到底是什么?

如果我们查看 Android 开发者网站对 LiveData 的定义,我们可以看到:

因此,LiveData 用于简化实现 ViewModel 的任务。 LiveData 最好的部分是当你的 View 在后台时,数据不会更新;然而,当视图进入前台时,它只接收更新的数据。

LiveData 的一些好处包括:

  1. 没有内存泄漏。
  2. 视图始终接收最新数据。
  3. 没有因活动停止而导致的崩溃。

setValue() 和 postValue() 有什么区别?

因此,如果您熟悉 LiveData,您可能已经遇到过这两种 LiveData 方法:setValue() 和 postValue()。因此,您可能想到的一个问题是,为什么同一功能需要两个方法 setValue 和 postValue。让我们看一个例子来找出答案。假设您想使用 LiveData 来更新一个值。因此,您将有两个选择:要么更新主线程上的数据,要么更新后台线程上的数据。因此,setValue 和 postValue 的用例仅限于这两个场景。

在主线程更改数据时,使用 MutableLiveData 类的 setValue 方法,在后台线程更改 LiveData 时,使用 MutableLiveData 类的 postValue 方法

虽然 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 changesThe 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 threadYou can use postValue if you are working in a background thread
The value is changed immediatelyThe 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.