Как я могу справиться с отключением от сети, используя RxJava 2 - PullRequest
0 голосов
/ 16 октября 2019

У меня есть некоторые проблемы, связанные с потерей сетевого подключения. Как я могу справиться с этим в RxJava 2? Большое спасибо.

У меня есть этот метод:

Disposable disposable = api.setStatus(params)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .doOnSubscribe(listener::onPreExecute)
            .doFinally(listener::onPostExecute)
            .subscribe(serviceRequest -> handleResponse(listener, serviceRequest), listener::onError);

//////////////

@POST("set_status")
Single<OrderResponse> setStatus(@FieldMap Map<String, String> params);

Ответы [ 3 ]

1 голос
/ 16 октября 2019

Новый ответ после обновления вопроса:

Вы можете обработать его в 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 объеме, и все будет хорошо

0 голосов
/ 16 октября 2019

Обрабатывать метод onError, как показано ниже

void onError(Throwable throwable) {
    if(throwable instanceof IOException) {
       //Handle network error
    }else if(throwable instanceof SocketTimeoutException) {
      //Handle Request timeout
    }else {
     //Show some error like something went wrong
    }
}
0 голосов
/ 16 октября 2019

если вы возвращаете Single для сетевых вызовов, вы можете использовать метод onErrorReturn, чтобы перехватить ошибку и вернуть состояние, чтобы указать сетевую ошибку.

...