androidRxJava操作符(五)

错误处理操作符

Rxjava在错误出现的时候就会调用Subscriber的onError方法将错误分发出去,由Subscriber自己来处理错误。但是如果每个Subscriber都处理一遍的话工作量很大,所以需要错误处理操作符。

1 catch

catch操作符拦截原始Observable的onError通知,将它替换成其他数据项或数据序列,让产生的Observable能够正常终止或者根本不终止

/**
     * onErrorReturn:Observable遇到错误时返回原来的Observable行为的备用Observable,
     * 备用Observable会忽略原有Observable的onError调用,不会将错误传递给观察者。
     * 作为替代,它会发射一个特殊的项并调用观察者的onCompleted。
     * onErrorRsumeNext:Observable遇到错误时返回原有Observable行为的备用Observable
     * 它会发射一个特殊的项并调用观察者的Observable的数据。
     * onExceptionResumeNext:如果收到的Throwable不是一个Exception,它会将错误传递给观察者的onError方法
     */
    private void catchOb()
    {
        Observable.create(new Observable.OnSubscribe<Integer>()
        {
            @Override
            public void call(Subscriber<? super Integer> subscriber)
            {
                for (int i = 0; i < 5; i++)
                {
                    if (i > 2)
                    {//当i大于2的时候发送错误
                        subscriber.onError(new Throwable("Throwable"));
                    }
                    subscriber.onNext(i);
                }
                subscriber.onCompleted();
            }
        }).onErrorReturn(new Func1<Throwable, Integer>()
        {
            @Override
            public Integer call(Throwable throwable)
            {
                return 6;//接收到onError的时候发送一个备用信息给Observable
            }
        }).subscribe(new Observer<Integer>()
        {
            @Override
            public void onCompleted()
            {
                Log.e(TAG, "onCompleted:");
            }

            @Override
            public void onError(Throwable e)
            {
                Log.e(TAG, "onError:" + e.getMessage());//得到报错信息
            }

            @Override
            public void onNext(Integer integer)
            {
                Log.e(TAG, "onNext:" + integer);
            }
        });

    }

2 retry

当出现onError会进行重新订阅,如果在重新订阅后还是受到错误则会将onError发送给观察者

/**
     * retry
     * retryWhen
     */
    private void retryOb()
    {
        Observable.create(new Observable.OnSubscribe<Integer>()
        {
            @Override
            public void call(Subscriber<? super Integer> subscriber)
            {
                for (int i = 0; i < 5; i++)
                {
                    if (i == 1)
                    {
                        subscriber.onError(new Throwable("Throwable"));
                    } else
                    {
                        subscriber.onNext(i);
                    }
                }
                subscriber.onCompleted();
            }
        }).retry(2)//设置重新订阅的次数,实际订阅次数为该次数+1,因为最开始就订阅了一次
                .subscribe(new Observer<Integer>()
                {

                    @Override
                    public void onCompleted()
                    {
                        Log.e(TAG, "onCompleted:");
                    }

                    @Override
                    public void onError(Throwable e)
                    {
                        Log.e(TAG, "onError:" + e.getMessage());//得到报错信息
                    }

                    @Override
                    public void onNext(Integer integer)
                    {
                        Log.e(TAG, "onNext:" + integer);
                    }
                });
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值