我创建了rx函数来从android中的view-model
调用网络调用,它解析主线程函数上的网络。
我只是更改了几行有效的代码。但是我需要知道原因,因为它使用相同的构建器模式来创建rx-call
。在平面图调用成功后,尝试更改.doOnSubscribe()
,doOnComplete ()
,.applySchedulers()
后,它是否起作用?这是怎么回事?
fun loadjobs(var countryID:String){
subscription.add(
repository.getMainJobsFromLocal(countryID)
.doOnSubscribe { postProgress(StatusModel(Status.IN_PROGRESS))}
.doOnComplete { postProgress(StatusModel(Status.COMPLETED)) }
.applySchedulers()
.flatMap {
if (it.isNullOrEmpty()) {
repository.getMainJobsFromServer(countryID)
} else {
Flowable.just(Response.success(it))
}
}
.subscribe({
if (it.isResponseOk()) {
postProgress(StatusModel(Status.SUCCESS))
mainJobResponse.postValue(it.body())
} else {
postProgress(StatusModel(Status.FAILED))
mainJobResponse.postValue(null)
}
}, {
postProgress(StatusModel(Status.FAILED))
mainJobResponse.postValue(null)
}))
}
fun loadjobs(var countryID){
subscription.add(
repository.getMainJobsFromLocal(countryID)
.flatMap {
if (it.isNullOrEmpty()) {
repository.getMainJobsFromServer(countryID).flatMap {
Flowable.just(it)
}
} else {
Flowable.just(Response.success(it))
}
}.doOnSubscribe { postProgress(StatusModel(Status.IN_PROGRESS)) }
.doOnComplete { postProgress(StatusModel(Status.COMPLETED)) }
.applySchedulers()
.subscribe({
if (it.isResponseOk()) {
postProgress(StatusModel(Status.SUCCESS))
mainJobResponse.postValue(it.body())
} else {
postProgress(StatusModel(Status.FAILED))
mainJobResponse.postValue(null)
}
}, {
postProgress(StatusModel(Status.FAILED))
mainJobResponse.postValue(null)
}))
}
将subscribeOn(Schedulers.io())
和observeOn(AndroidSchedulers.mainThread())
添加到您的观察对象中。
applySchedulers()在平面图调用后起作用了吗?这是怎么回事?
observeOn()
影响下游的所有内容。如果在flatMap()
之后有一个observeOn()
,它将在该调度程序上执行。
同样地,subscribeOn()
影响上游链。
由于这些原因,对于大多数用例,您希望将调度程序应用在rx链的末尾而不是中间。