在这种情况下,我观察到所需的零件,或者在livedata中发布值本身足以对其进行正确处理。
method()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ liveData.postValue(it) },
{ Timber.e(it) }
)
答案 0 :(得分:4)
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
。
答案 1 :(得分:0)
observeOn()
->此方法只是将所有运算符的线程更改为更下游(在随后的调用中)。
observeOn()
->这仅影响预订Observable时使用的线程,并且该线程将留在其下游
如果上述情况有问题,如果observeOn(AndroidSchedulers.mainThread())
之后的调用需要在UI线程上运行,基本上liveData.postValue(it)
在UI线程上进行了一些更改,则需要此行。
如果将其删除,则进一步的调用将在subscribeOn()
方法产生的线程上运行。
下面的链接很好地解释了subscribeOn()和observeOn()方法: https://medium.com/upday-devs/rxjava-subscribeon-vs-observeon-9af518ded53a
希望这会有所帮助。