Rxjava组合操作符实现多个网络请求打包发送

版权声明: https://blog.csdn.net/shoneworn/article/details/81118497

简述:

        都知道Rxjava很强大。各种操作符,简直神奇的令人眼花缭乱。这里就讲一下concat操作符。也叫组合操作符。
TMD 无语了,firefox今天在我写这篇文章的时候崩溃了3次了。关键是,没有保存的习惯,都是自动保存,结果,都快写完了,一下子崩溃,写的都没了。算了。没心情写详细了。简单点贴贴代码吧!

实现:

concat操作符是有序的,而concat操作符是接收若干个Observables,发射数据是有序的,不会交叉。

 private void testConcat() {
        Observable<Integer> ob1 = Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(1);
                subscriber.onCompleted();   //必须要subscribe.onCompleted()方法。不然,下面的观察者就只能收到第一个事件
            }
        });
        Observable<Integer> ob2 = Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(2);
                subscriber.onCompleted();    //必须要subscribe.onCompleted()方法。不然,下面的观察者就只能收到第一个事件
            }
        });
        Observable<Integer> ob3 = Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(3);
                subscriber.onCompleted();    //必须要subscribe.onCompleted()方法。不然,下面的观察者就只能收到第一个事件
            }
        });
        Observable.concat(ob1,ob2,ob3)
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onCompleted() {
                        System.out.println("shoneworn:onCompleted");
                    }

                    @Override
                    public void onError(Throwable e) {
                        System.out.println("shoneworn:onError");
                    }

                    @Override
                    public void onNext(Integer integer) {
                        System.out.println("shoneworn:"+integer);
                    }
                });
    }

看看运行结果

07-19 17:12:32.567 13102-13102/com.ailin.shone I/System.out: shoneworn:1
07-19 17:12:32.567 13102-13102/com.ailin.shone I/System.out: shoneworn:2
07-19 17:12:32.567 13102-13102/com.ailin.shone I/System.out: shoneworn:3
07-19 17:12:32.568 13102-13102/com.ailin.shone I/System.out: shoneworn:onCompleted

基础数据这么干,没问题,发送有序,接收也有序。好了,没问题就可以上网络请求

非完整代码。封装好的网络请求。你可以自己实现。本来想搞完整的代码。今天被这破浏览器给恶心到了。简单贴代码了

Observable<HttpResult> httpRequest1= Observable.create(new Observable.OnSubscribe<HttpResult>() {
			@Override
			public void call(Subscriber<? super HttpResult> subscriber) {
				HttpResult httpResult = HttpHelper.get(Constants.SERVER_CONTROL_URL);
				if(httpResult!=null) {
					subscriber.onNext(httpResult);
				}else {
					System.out.println("cxx;http1 is error");
				}
				subscriber.onCompleted();
			}
		}).subscribeOn(Schedulers.io());
		Observable<HttpResult> httpRequest2= Observable.create(new Observable.OnSubscribe<HttpResult>() {
			@Override
			public void call(Subscriber<? super HttpResult> subscriber) {
				HttpResult httpResult = HttpHelper.get(url);
				if(httpResult!=null) {
					subscriber.onNext(httpResult);
				}else {
					subscriber.onError(null);
					System.out.println("cxx;http2 is error");
				}
				subscriber.onCompleted();
			}

		}).subscribeOn(Schedulers.io());
		Observable<HttpResult> httpRequest3= Observable.create(new Observable.OnSubscribe<HttpResult>() {
			@Override
			public void call(Subscriber<? super HttpResult> subscriber) {
				HttpResult httpResult = HttpHelper.post(Constants.GET_CONFIG_FROM_SERVER_NEW, params);
				if(httpResult!=null) {
					subscriber.onNext(httpResult);
				}else {
					System.out.println("cxx;http3 is error");
				}
				subscriber.onCompleted();
			}
		}).subscribeOn(Schedulers.io());

		Observable.concat(httpRequest1,httpRequest2,httpRequest3).subscribe(new Observer<HttpResult>() {
			@Override
			public void onCompleted() {
			}

			@Override
			public void onError(Throwable e) {
				e.printStackTrace();
			}

			@Override
			public void onNext(HttpResult httpResult) {
				if(httpResult!=null)
					getInfoConfigFroSever(httpResult);
			}
		});

注意:我这里把网络请求丢到io线程去了。观察者接收到的数据,我没有给切换到main线程。因为这里我不需要这么干。我的业务逻辑不需要。你要是需要,你可以切换到main线程 。

猜你喜欢

转载自blog.csdn.net/shoneworn/article/details/81118497