(四)RxJava操作符:zip数据合并操作
2016-03-29 15:39
393 查看
博客首页
使用场景:
当某界面内容来源不同,但需同时显示出来时
eg1: 一部分数据来自本地,一部分来自网络
效果如下:
eg2: 当然对于来源不同、类型不同的数据我们也可以使用Zip的,只需将两种Fun2的call()方法中先暂存起来,最后在订阅回调中分离使用即可,常见的应用场所比如下面这个界面。
顶部是Html组成的Web页面,底部是原生的评论页面,数据分别来自两个不同的接口,为了保证界面的完整显示,在这里我们可以使用Zip。
源码: https://github.com/cn-ljb/rxjava_for_android
使用场景:
当某界面内容来源不同,但需同时显示出来时
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); } } );
源码: https://github.com/cn-ljb/rxjava_for_android
相关文章推荐
- 在Eclipse中遇到The type XXX cannot be resolved. It is indirectly referenced from required .class files错误
- Java自学最佳实践 get √
- spring AutowireCapableBeanFactory 自动注入
- 浅懂java 软引用和强引用
- 使用Java语言将 jpg 格式图片转为 ppm 格式图片
- CAS4.0集成restlet手册
- Java面向对象-包装类
- Java 线程基础-1
- Springmvc中视图向控制器传输参数的一种方法
- win7下设置jdk环境变量遇到的问题
- 小学生之SpringMVC
- 新鲜出炉springmvc
- java bean Format注解用法
- java学习之java.lang包
- JAVA中String和byte[]和InputStream之间的相互转换
- java基础知识总结10
- java io模型
- Java中取小数点后两位
- Java添加事件监听的四种方法代码实例
- IDEA javadoc 编码GBK的不可映射字符