(四)RxJava操作符:zip數據合併操作



使用場景:
        當某界面內容來源不同,但需同時顯示出來時
        eg1:    一部分數據來自本地,一部分來自網絡
Observable.zip(
queryContactsFromLocation(),
queryContactsForNet(),
new Func2<List<Contacter>, List<Contacter>, List<Contacter>>() {
@Override
public List<Contacter> call(List<Contacter> contacters, List<Contacter> contacters2) {
contacters.addAll(contacters2);
return contacters;
}
}
).compose(this.<List<Contacter>>bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<List<Contacter>>() {
@Override
public void call(List<Contacter> contacters) {
initPage(contacters);
}
});
/**
* 模擬手機本地聯繫人查詢
*/
private Observable<List<Contacter>> queryContactsFromLocation() {
return Observable.create(new Observable.OnSubscribe<List<Contacter>>() {
@Override
public void call(Subscriber<? super List<Contacter>> subscriber) {

ArrayList<Contacter> contacters = new ArrayList<>();
contacters.add(new Contacter("location:張三"));
contacters.add(new Contacter("location:李四"));
contacters.add(new Contacter("location:王五"));
subscriber.onNext(contacters);
subscriber.onCompleted();
}
});
}
/**
* 模擬網絡聯繫人列表
*/
private Observable<List<Contacter>> queryContactsForNet() {
return Observable.create(new Observable.OnSubscribe<List<Contacter>>() {
@Override
public void call(Subscriber<? super List<Contacter>> subscriber) {

try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}

ArrayList<Contacter> contacters = new ArrayList<>();
contacters.add(new Contacter("net:Zeus"));
contacters.add(new Contacter("net:Athena"));
contacters.add(new Contacter("net:Prometheus"));
subscriber.onNext(contacters);
subscriber.onCompleted();
}
});
}
效果如下:
    


        eg2:    當然對於來源不同、類型不同的數據我們也可以使用Zip的,只需將兩種Fun2的call()方法中先暫存起來,最後在訂閱回調中分離使用即可,常見的應用場所比如下面這個界面。
    

    頂部是Html組成的Web頁面,底部是原生的評論頁面,數據分別來自兩個不同的接口,爲了保證界面的完整顯示,在這裏我們可以使用Zip。
Observable.zip(
mArticleProtocol.getNewsDetail(params_detail),
mCommentProtocol.getCommentList(params_comm),
new Func2<ArticleDetailBean, CommentListBean, List>() {
@Override
public List call(ArticleDetailBean articleDetailBean, CommentListBean commentBean) {
List list = new ArrayList();
list.add(articleDetailBean);
list.add(commentBean);
return list;
}
})
.observeOn(AndroidSchedulers.mainThread())
.compose(this.<List>bindUntilEvent(ActivityEvent.DESTROY))
.subscribe(
new Action1<List>() {
@Override
public void call(List list) {
initPage(list);
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
mPageLayout.setPageState(PageStateLayout.STATE_ERROR);
}
}
);




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章