Модификация - android.os.NetworkOnMainThreadException с помощью RxKotlin - PullRequest
1 голос
/ 11 ноября 2019

Я создал функцию 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)
    }))
}

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

applySchedulers () после вызова flatmap это сработало? Как это случилось?

observeOn() влияет на все вниз по течению. Если у вас есть flatMap() после observeOn(), он запускается в этом планировщике.

Аналогично subscribeOn() влияет на цепочку восходящего потока.

По этим причинам в большинстве случаев выЯ хочу, чтобы планировщики применялись в конце вашей цепочки приема, а не в середине.

0 голосов
/ 11 ноября 2019

Добавьте subscribeOn(Schedulers.io()) и observeOn(AndroidSchedulers.mainThread()) к вашей наблюдаемой.

...