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