android - 改造 - android.os.NetworkOnMainThreadException 与 RxKotlin

标签 android android-viewmodel flatmap rx-kotlin

我已经创建了 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/

相关文章:

java - 在 Java 中使用 RxJava2 编写后续 API 请求

android - 具有不同于 SQLite 模型类的自定义模型类的分页库 - Android

android - 在 ViewModel 类中使用新线程

android - 如何在没有 ViewModelProviders 类的情况下获得 ViewModel?

android - 在类中调用 View 模型

scheme - SICP中 `flatmap`有什么意义?

c# - 如何在 Unity3D 上为 android 显示 Google Play 游戏 "Welcome Back"toast?

Android:添加带有展开动画的 View (不闪烁)

java - 为什么 Stream.flatMap 不能接受一个集合?

java - 在现有 Java 7 代码中使用 Java 8 Optional