改造 - android.os.NetworkOnMainThreadException 使用 RxKotlin
Retrofit - android.os.NetworkOnMainThreadException with RxKotlin
我创建了 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())
添加到您的 Observable。
applySchedulers() after the flatmap call it worked? how is this happened?
observeOn()
影响下游的一切。如果在 observeOn()
之后有 flatMap()
,它将在该调度程序上执行。
同样subscribeOn()
影响上游链。
出于这些原因,对于大多数用例,您希望在 rx 链的末尾而不是中间应用调度程序。
我创建了 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())
添加到您的 Observable。
applySchedulers() after the flatmap call it worked? how is this happened?
observeOn()
影响下游的一切。如果在 observeOn()
之后有 flatMap()
,它将在该调度程序上执行。
同样subscribeOn()
影响上游链。
出于这些原因,对于大多数用例,您希望在 rx 链的末尾而不是中间应用调度程序。