简述:
都知道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线程 。