RxJava并发请求记录

看过一些关于RxJava并发的文章,终究还是自己测试一下比较心安,根据这篇博客测试几个常见的实现https://www.jianshu.com/p/6f428b52555a

首先来2个Observable备用,当然.subscribeOn(Schedulers.newThread())这个少不了,不然都在一个线程哪来的并发.

private List<Observable<String>> initObservables() {
        List<Observable<String>> obsList = new ArrayList<>();
        Observable<String> obs1 = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
                Log.e("TAG", "observable1:" + Thread.currentThread().getName());
                Thread.sleep(5000);
                emitter.onNext("obs1");
                emitter.onComplete();
            }
        }).subscribeOn(Schedulers.newThread());
        Observable<String> obs2 = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
                Log.e("TAG", "observable2:" + Thread.currentThread().getName());
                Thread.sleep(10000);
                emitter.onNext("obs2");
                emitter.onComplete();
            }
        }).subscribeOn(Schedulers.newThread());
        obsList.add(obs1);
        obsList.add(obs2);
        return obsList;
    }

其次再来测试下面的3个方法

merge(),concat(),zip()
private void rxMerge() {
        Observable.merge(initObservables())
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) { }

            @Override
            public void onNext(@NonNull String s) {
                Log.e("TAG","onNext"+s);
            }

            @Override
            public void onError(@NonNull Throwable e) { }

            @Override
            public void onComplete() { }
        });
    }

 merge()结果

private void rxZip() {
        List<Observable<String>> observables = initObservables();
        Observable.zip(observables.get(0), observables.get(1), new BiFunction<String, String, String>() {

            @NonNull
            @Override
            public String apply(@NonNull String s, @NonNull String s2) throws Exception {
                    return s + s2;
                }
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<String>() {
                @Override
                public void onSubscribe(@NonNull Disposable d) { }

                @Override
                public void onNext(@NonNull String s) {
                    Log.e("TAG", "onNext" + s);
                }

                @Override
                public void onError(@NonNull Throwable e) { }

                @Override
                public void onComplete() { }
            });
    }

 zip()结果 

 

private void rxConcat(){
        Observable.concat(initObservables())
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) { }

                    @Override
                    public void onNext(@NonNull String s) {
                        Log.e("TAG","onNext"+s);
                    }

                    @Override
                    public void onError(@NonNull Throwable e) { }

                    @Override
                    public void onComplete() { }
                });
    }

concat()结果 

 

实验结论如下

/**
 * merge()可以并发
 * Observable.subscribeOn(Schedulers.newThread())
 * 谁先执行完,先返回谁的结果
 * 适合处理先来先展示的场景
 */
/**
 * zip()可以并发
 * Observable..subscribeOn(Schedulers.newThread())
 * 一起执行完,再返回结果
 * 适合处理一起展示的场景,类似Countdownlatch */
/**
 * concat()无法并发
 */

 这篇文章只记录并发的情况,串行则可以去掉.subscribeOn(Schedulers.newThread()),或者使用flatMap()已经其他api实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值