Я использую 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()
}
}