Новый ответ после обновления вопроса:
Вы можете обработать его в doOnError
или в своем listener::onError
:
Disposable disposable = api.setStatus(params)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.doOnError(error->{
handleError(error)
})
.subscribe(serviceRequest -> handleResponse(listener, serviceRequest), listener::onError);
void handleError(Throwable error){
if (error instanceof IOException){
// handle network error
} else {
if(error instanceof SocketTimeoutException){
// handle timeout error
}
}
}
Старый ответо подписке на изменение подключения:
Для этого вам нужно отследить изменение сетевого подключения и отправить его через BehaviorSubject
.
Пример:
class NetworkManager(
private val context: Context
) {
private val state: BehaviorSubject<Boolean> = BehaviorSubject.create()
private val receiver = object : BroadcastReceiver() {
override fun onReceive(c: Context?, intent: Intent?) {
state.onNext(isConnected())
}
}
init {
val intentFilter = IntentFilter()
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
context.registerReceiver(receiver, intentFilter)
state.onNext(isConnected())
}
fun subscribe(): Observable<Boolean> {
return state
}
fun isConnected(): Boolean {
val cm = context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val netInfo = cm.activeNetworkInfo
return netInfo != null && netInfo.isConnectedOrConnecting
}
}
Создайте этот класс в вашем Application
объеме, и все будет хорошо