我已经创建了 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)
}))
}
最佳答案
applySchedulers() after the flatmap call it worked? how is this happened?
observeOn()
影响下游的一切。如果在 observeOn()
之后有一个 flatMap()
,它将在该调度程序上执行。
同样 subscribeOn()
影响上游链。
出于这些原因,对于大多数用例,您希望在 rx 链的末尾而不是中间应用调度程序。
关于android - 改造 - android.os.NetworkOnMainThreadException 与 RxKotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58795905/