四、RxJava基础 ---合并操作(Combining Observables)

来源:互联网 发布:淘宝联盟个人可以买吗 编辑:程序博客网 时间:2024/05/22 14:26

一、前言

上篇主要介绍了 过滤操作,本篇介绍合并操作

二、合并操作(Combining Observables)

使用多个Observables来创建一个Observable

1、zip

使用一个函数组合多个Observable发射的数据集合,然后再发射这个结果。如果多个Observable发射的数据量不一样,则以最少的Observable为标准进行压合。内部通过OperatorZip进行压合。

zip 图示

 /**     * zip : 使用一个函数组合多个Observable发射的数据集合,然后再发射这个结果。     *      如果多个Observable发射的数据量不一样,则以最少的Observable为标准进行压合。     *      内部通过OperatorZip进行压合。     */    private void zipTest() {        Observable observableNick = Observable.just("寒冰射手", "德玛西亚之力", "流浪法师");        Observable observableName = Observable.just("艾希", "盖伦", "瑞兹", "莫甘娜");        Observable.zip(observableName, observableNick, new Func2<String, String, String>() {            @Override            public String call(String name, String nick) {                return name + "--昵称->" + nick;            }        }).subscribe(new Action1<String>() {            @Override            public void call(String s) {                Log.d("zip", s);                // 艾希--昵称->寒冰射手                // 盖伦--昵称->德玛西亚之力                // 瑞兹--昵称->流浪法师            }        });    }

2、merge

将多个Observable合并为一个。不同于concat,merge不是按照添加顺序连接,而是按照时间线来连接。其中mergeDelayError将异常延迟到其它没有错误的Observable发送完毕后才发射。而merge则是一遇到异常将停止发射数据,发送onError通知。

merge

/**     * merge : 根据 Observable 发送的时间顺序 执行 ,(异步)     */    private void mergeTest(){        Observable observableName = Observable.create(new Observable.OnSubscribe<String>() {            @Override            public void call(Subscriber<? super String> subscriber) {                Log.d("merge 1",""+Thread.currentThread().getName());                subscriber.onNext("艾希");                try {                    Thread.sleep(5000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                subscriber.onNext("盖伦");            }        }).subscribeOn(Schedulers.newThread());        Observable observableNick = Observable.create(new Observable.OnSubscribe<String>() {            @Override            public void call(Subscriber<? super String> subscriber) {                Log.d("merge 2",""+Thread.currentThread().getName());                subscriber.onNext("1");                try {                    Thread.sleep(3000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                subscriber.onNext("2");            }        }).subscribeOn(Schedulers.newThread());        Observable                .merge(observableName,observableNick)                .observeOn(AndroidSchedulers.mainThread())                .subscribe(new Action1<String>() {                    @Override                    public void call(String s) {                        Log.d("merge",s);                         // 异步 结果--------                        // merge: 艾希                        // merge: 1                        // merge: 2                        // merge: 盖伦                         // 同步 结果--------                        // merge: 艾希                        // merge: 盖伦                        // merge: 1                        // merge: 2                    }                });    }

3、Join

原创粉丝点击