我如何使用 RxJava 2 处理网络断开连接

How i can handle network disconnect using RxJava 2

我有一些问题,与网络连接丢失有关。我如何在 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);

如果您 return 单次网络调用,您可以使用 onErrorReturn 方法捕获错误并 return 状态指示网络错误。

问题更新后的新答案:

您可以在 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 范围内创建这个类就可以了

在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
    }
}