【问题标题】:Is observeOn requried for livedata postvalue?livedata postvalue是否需要observeOn?
【发布时间】:2019-04-23 13:42:19
【问题描述】:
在这种情况下需要观察部分,或者在 livedata 中发布值本身就足以对其进行正确处理。
method()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ liveData.postValue(it) },
{ Timber.e(it) }
)
【问题讨论】:
标签:
kotlin
rx-java2
android-livedata
【解决方案1】:
observeOn 将强制它下面的所有操作在您作为参数传递的调度程序的线程上运行。在这种情况下,您将强制订阅在主线程上工作。阅读this了解更多信息。
Livedata 有两种更新其值的方法:您可以使用livedata.setValue(newValue)(Kotlin 中的livedata.value = newValue)或livedata.postValue(newValue)。第一个选项仅适用于主线程。另一方面,postValue 通常用于从后台线程设置值(后台线程实际上是向主线程发布任务以更新值)。
鉴于所有这些,在这种情况下,由于您使用的是postValue,因此您无需在主线程上强制订阅。但是请注意,由于postValue 不是同步的,因此从主线程调用它并不能保证立即执行。例如,在您的订阅者中,如果您先调用livedata.postValue(newValue),然后调用livedata.setValue(anotherValue),则setValue 将首先执行。换句话说,您的livedata 的值将被设置为anotherValue,然后被覆盖为newValue。如果要保持在主线程中执行,请使用setValue。
【解决方案2】:
observeOn() -> 这个方法只是简单地改变所有操作符的线程进一步下游(在随后的调用中)。
observeOn() -> 这只会影响订阅 Observable 时使用的线程,并且它会留在下游
如果上面提到的情况,如果observeOn(AndroidSchedulers.mainThread())之后的调用需要在UI线程上运行,基本上liveData.postValue(it)在UI线程上做了一些改变,那么需要这一行。
如果它被删除,进一步的调用将在subscribeOn() 方法产生的线程上运行。
下面的链接很好地解释了 subscribeOn() 和 observeOn() 方法:
https://medium.com/upday-devs/rxjava-subscribeon-vs-observeon-9af518ded53a
希望这会有所帮助。