Retrofit-带有RxKotlin的android.os.NetworkOnMainThreadException

问题描述 投票:1回答:2

我创建了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)
    }))
}
android android-viewmodel flatmap rx-kotlin
2个回答
0
投票

subscribeOn(Schedulers.io())observeOn(AndroidSchedulers.mainThread())添加到您的观察对象中。


0
投票

applySchedulers()在平面图调用后起作用了吗?这是怎么回事?

observeOn()影响下游的所有内容。如果在flatMap()之后有一个observeOn(),它将在该调度程序上执行。

同样地,subscribeOn()影响上游链。

由于这些原因,对于大多数用例,您希望将调度程序应用在rx链的末尾而不是中间。

© www.soinside.com 2019 - 2024. All rights reserved.