android - 改造 - 带有 RxKotlin 的 android.os.NetworkOnMainThreadException
问题描述
我创建了 rx 函数来从view-model
android 中调用网络调用,它在主线程函数上解析网络。
我只是更改了几行代码就可以了。但我需要知道原因,因为它使用相同的构建器模式来创建rx-call
. 一旦我尝试更改.doOnSubscribe()
, doOnComplete ()
,.applySchedulers()
在 flatmap 调用之后它起作用了吗?这是怎么回事?
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)
}))
}
解决方案
在 flatmap 调用之后 applySchedulers() 起作用了吗?这是怎么回事?
observeOn()
影响下游的一切。如果您有flatMap()
after observeOn()
,它将在该调度程序上执行。
同样subscribeOn()
影响上游链。
由于这些原因,对于大多数用例,您希望将调度程序应用在 rx 链的末端而不是中间。
推荐阅读
- java - War部署到嵌套目录时如何配置Jetty?
- c# - 使用 C# 验证来自 Slack Events API 的请求
- excel - XML。是否可以从其他文件添加部分数据?
- mongodb - Distinct后如何在Spring Boot MongoDB中返回具有特定字段的对象
- blockchain - 如何将我的智能合约与另一个已部署的智能合约连接起来?
- sql - 将 YYYY-MM 列添加到现有表
- mongodb - Mongodb查询以获取有关循环依赖的信息
- javascript - React Native - 禁用嵌套滚动
- reactjs - FirebaseUI 依赖冲突
- rust - 如何在柯里化函数上实现特征?