Как предотвратить CompositeDisposable, вызывающий HTTP FAILED: java. net .SocketException? - PullRequest
0 голосов
/ 07 мая 2020

Я использую Retrofit + RxJava2 и следую начальной практике: вызов CompositeDisposable в OnStop и добавление CompositeDisposable.add () в onStart. Несмотря на то, что я использую MVVM и создаю CompositeDisposable в ViewModel, мне все равно нужно сделать это вручную .

Это предотвращает возможность инициировать сетевой запрос из фона , потому что, если это произойдет Я могу получить исключение из-за того, что Android делает не разрешает вызов сетевых запросов в фоновом режиме (попробуйте, например, включить режим экономии заряда батареи, и вы увидите, как все сетевые запросы терпят неудачу)

Проблема в том, что если я врожденный сетевой запрос, когда приложение находится на переднем плане, и быстро go возвращается в фоновый режим, происходит CompositeDisposable.clear () и мой сетевой запрос завершается с HTTP FAILED : java. net .SocketException. ..

Как мне обрабатывать такое поведение?

Вот мой запрос сети опроса , который все еще может выполняться в onStop , когда CompositeDisposable вызывает clear ()

class UseCase(private val userDetails:
                                           UserDetails,
                                           val apiService: APIService, val compositeDisposable: CompositeDisposable) {

    val resultsHotObservable:BehaviorSubject<Model> = BehaviorSubject.create()

    fun startRepeadedNetworkRequest(){
        val observable = Observable.defer { startCheckingResults() }
                .repeatWhen { observable -> observable.delay(5, TimeUnit.MILLISECONDS) }
                .takeUntil { it.data = FINISHED) }
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ response ->
                    resultsHotObservable.onNext(response)
                }, {

                })
          compositeDisposable.add(observable)
    }

    private fun startCheckingResults():Observable<Model> {
        return apiService.startReceivingData(AuthTokenRequest(
                userDetails.token)
        )
    }

    fun onStop(){
      //is triggered from activity to clear current request and prevent network request from being executed in background
      compositeDisposable.clear()
    }

}
...