android - 如何订阅点击事件以便异常情况不会取消订阅?

标签 android rx-java

我正在使用RxJava for Android (RxAndroid)我订阅了 View 的点击事件,并对它们执行如下操作:

subscription = ViewObservable.clicks(view, false)
    .map(...)
    .subscribe(subscriberA);

问题是每当出现异常时,subscriberA 就会自动取消订阅,导致下一次点击不会触发任何内容。

如何处理异常,以便拦截所有点击事件,而不管是否抛出异常?

最佳答案

使用retry方法:

subscription = ViewObservable.clicks(view, false)
    .map(...)
    .retry()
    .subscribe(subscriberA)

但是,您不会在 onError 中收到任何异常。 要使用重试(重新订阅)逻辑处理异常,请使用 retryWhen :

subscription = ViewObservable.clicks(view, false)
    .map(...)
    .retryWhen(new Func1<Observable<? extends Notification<?>>, Observable<?>>() {

        @Override
        public Observable<?> call(Notification errorNotification) {
            Throwable throwable = errorNotification.getThrowable();
            if (errorNotification.isOnError() && handleError(throwable)) {
                // return the same observable to resubscribe
                return Observable.just(errorNotification);
            }
            // return unhandled error to handle it in onError and unsubscribe
            return Observable.error(throwable);
        }

        private boolean handleError(Throwable throwable) {
            // handle your errors
            // return true if error handled to retry, false otherwise
            return true;
        }
    }
    .subscribe(subscriberA)

关于android - 如何订阅点击事件以便异常情况不会取消订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26154236/

相关文章:

android - @TargetApi 注释是否仅适用于一个 Api 级别或更高级别?

java - 如何将 Observable.fromCallable() 与已检查的异常一起使用?

rx-java - 为什么在 replay() 之前调用publish()很重要

java - 如何在 RxJava 服务器轮询中对 "repeatWhen"进行单元测试

java - 在 RxJava 中倒带一个 Observable?

Android 在构造函数中设置样式

android - 回收站 View : How to load items only when the user has stopped scrolling?

android - 自定义标题栏和选项卡

android - 停止 Observable.interval 并发送 onComplete

java - Concat 与 ConcatArray RxJava