安卓RxJava第三弹之 响应式

1.错误处理

到目前为止,我们都没怎么介绍onComplete()和onError()函数。这两个函数用来通知订阅者,被观察的对象将停止发送数据以及为什么停止(成功的完成或者出错了)。

下面的代码展示了怎么使用这两个函数:

public class MainActivity1 extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 注意这里的参数是 query所返回的Observable的输出,并且返会一个Observable<String>
        query().flatMap(new Func1<List<String>, Observable<String>>() {
            @Override
            public Observable<String> call(List<String> strings) {
                //结合from处理
                return Observable.from(strings);
            }
        }).flatMap(new Func1<String, Observable<String>>() {
            @Override
            public Observable<String> call(String s) {
                //我们在这里调用`addPre`方法,就行处理
                return addPre(s);
            }
        }).filter(new Func1<String, Boolean>() {//filter 过滤,把不符合条件的过滤掉,留下符合条件的
                    @Override
                    public Boolean call(String s) {
                        return s.contains("a");
                    }
                }).take(3)//take 指定最多输出的数量
                .doOnNext(new Action1<String>() {//doOnNext 允许我们在每次输出一个元素之前做一些额外的事情(其实就是在onNext里调用的)
                    @Override
                    public void call(String s) {
                        System.out.println("doOnNext:" + s);
                    }
                }).
                subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {
                        //Observerable对象终结
                    }

                    @Override
                    public void onError(Throwable e) {
                        //错误处理
                    }

                    @Override
                    public void onNext(String s) {
                        System.out.println("_flatMap:" + s);
                    }
                });
    }

    static Observable<List<String>> query() {
        List<String> s = Arrays.asList("Java", "Android", "Ruby", "Ios", "Swift");
        // List<String> s1 = Arrays.asList("Java", "Android", "Ruby", "Ios", "Swift");
        return Observable.just(s);
        // return Observable.just(s,s1);//可以添加多个Just
    }

    //增加个函数,用来增加个前缀:
    static Observable<String> addPre(String lan) {
        return Observable.just("addPre_" + lan);
    }
}
代码中的potentialException() 和 anotherPotentialException()有可能会抛出异常。每一个Observerable对象在终结的时候都会调用 onCompleted()或者onError()方法,所以Demo中会打印”Completed!”或者”Ouch!”。


这种模式有以下几个优点:

1.只要有异常发生onError()一定会被调用

这极大的简化了错误处理。只需要在一个地方处理错误即可以。

2.操作符不需要处理异常

将异常处理交给订阅者来做,Observerable的操作符调用链中一旦有一个抛出了异常,就会直接执行onError()方法。

3.你能够知道什么时候订阅者已经接收了全部的数据。

知道什么时候任务结束能够帮助简化代码的流程。(虽然有可能Observable对象永远不会结束)

使用RxJava,Observable对象根本不需要知道如何处理错误!操作符也不需要处理错误状态-一旦发生错误,就会跳过当前和后续的操作符。所有的错误处理都交给订阅者来做。

模拟加载网络图片:

public class MainActivity extends Activity {

    private ImageView imageView;

    int imageId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = (ImageView) findViewById(R.id.image_imageView);
        imageId = R.drawable.base;


        Observable.create(new Observable.OnSubscribe<Drawable>() {
            @Override
            public void call(Subscriber<? super Drawable> subscriber) {

                //让其休眠5秒中后显示图片
                try {
                    Thread.sleep(5*1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                Drawable drawable = getDrawable(R.drawable.base);
                subscriber.onNext(drawable);
                subscriber.onCompleted();
            }
        })
        .subscribeOn(Schedulers.io()) //事件发送,即图片加载在IO线程
        .observeOn(AndroidSchedulers.mainThread())  //事件处理,即图片显示在UI线程
        .subscribe(new Observer<Drawable>() {
            @Override
            public void onCompleted() {
                Toast.makeText(getApplicationContext(),"success",Toast.LENGTH_SHORT);
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Drawable drawable) {
                imageView.setImageDrawable(drawable);
            }
        });
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值