1. 数据的三级缓存

final Observable memory = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super String> subscriber) {
if (memoryCache != null) {
subscriber.onNext(memoryCache);
} else {
subscriber.onCompleted();
}
}
});
Observable disk = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super String> subscriber) {
String cachePref = rxPreferences.getString("cache").get();
if (!TextUtils.isEmpty(cachePref)) {
subscriber.onNext(cachePref);
} else {
subscriber.onCompleted();
}
}
}); Observable network = Observable.just("network"); //主要就是靠concat operator来实现
Observable.concat(memory, disk, network)
.first()
.subscribeOn(Schedulers.newThread())
.subscribe(s -> {
memoryCache = "memory";
System.out.println("--------------subscribe: " + s);
});

取数据,首先检查内存是否有缓存;然后检查文件缓存中是否有;最后才从网络中取;前面任何一个条件满足,就不会执行后面的

2.界面需要等到多个接口并发取完数据,再更新
//拼接两个Observable的输出,不保证顺序,按照事件产生的顺序发送给订阅者
private void testMerge() {
Observable observable1 = DemoUtils.createObservable1().subscribeOn(Schedulers.newThread());
Observable observable2 = DemoUtils.createObservable2().subscribeOn(Schedulers.newThread()); Observable.merge(observable1, observable2)
.subscribeOn(Schedulers.newThread())
.subscribe(System.out::println);
} 3.一个接口的请求依赖另一个API请求返回的数据

举个例子,我们经常在需要登陆之后,根据拿到的token去获取消息列表。

这里用RxJava主要解决嵌套回调的问题,有一个专有名词叫 Callback hell

NetworkService.getToken("username", "password")
.flatMap(s -> NetworkService.getMessage(s))
.subscribe(s -> {
System.out.println("message: " + s);
});
4. 界面按钮需要防止连续点击的情况
RxView.clicks(findViewById(R.id.btn_throttle))
.throttleFirst(1, TimeUnit.SECONDS)
.subscribe(aVoid -> {
System.out.println("click");
}); 5.响应式的界面
比如勾选了某个checkbox,自动更新对应的preference
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences); Preference checked = rxPreferences.getBoolean("checked", true); CheckBox checkBox = (CheckBox) findViewById(R.id.cb_test);
RxCompoundButton.checkedChanges(checkBox)
.subscribe(checked.asAction());
6.复杂的数据变换
Observable.just("1", "2", "2", "3", "4", "5")
.map(Integer::parseInt)
.filter(s -> s > 1)
.distinct()
.take(3)
.reduce((integer, integer2) -> integer.intValue() + integer2.intValue())
.subscribe(System.out::println);//9 8.Netflix的真实例子

  a..假设我们需要通过一个用户的userId,执行queryA获取他/她所关注的视频列表,列表中的对象是Video类型对象,返回值是Json格式的string。

  b.获取了列表之后我们只需要获取前10个Video对象。

  c.非常不幸的事情是,我们获取的Video对象不是一个完整的Video对象,queryA返回的值还缺少了三个类成员->Rating, Metadata和BookMark.。所以我们得通过Video对象的Id,call三个不同 api来获取缺失的三个值,再讲他们重新填入对应的Video对象。

那么针对上面的需求我们可以整理一下思路,每一步究竟要做什么:

Step1:通过userId获取video的数据,这个时候我们需要一个Observable<Video>

Step2:取前10个对象,这里实现很简单,take(10)足矣,依然是返回Observable<Video>。

Step3:这一步需要我们进行nested callback了,因为每一个Video对象我们都需要进行三个额外的API call,去获取Rating,MetaData和Bookmark。但是这三个call都是同一时间进行的。所以我们在这一步可以通过flatmap把Step2里面产生的Observable转换成多个(分别是Observable, Observable 和 Observable),并且整合上述三个api call结果并且生成一个新的Observable<Video>返回。

Step4:在Step3中怎么整合?试试zip()这个操作符吧!简单的说就是把若干不同的Obervable整合成一个Observable。比如我们最终需要一个A对象,然后A由B和C对象组成,那么假如我们有一个Observable<B>和Observable<C>的话,就可以把这两个Observable zip一下整合成一个Observable<A>。

zip()

因为我们需要将三个Api call的结果整合在一起(Rating,MetaData,Bookmark)生成一个Video,所以我们这里选择可以用zip()。

我们先上代码,分别是Video类,VideoService类

video类

Video类的实现比较简单,只是单纯的加入了几个class member。但是注意MetaData, BookMark, Rating这三个member是有getObservable方法的。

接下里是VideoService类

 

 

 

 

可以看第一个方法是根据UserId返回原始Video对象的Observable,剩下三个则是根据videoId获取bookmark,rating,metadata的Observable的方法。他们基本上都是差不多的。

那么在定义好这些方法之后我们要开始调用他们了,调用代码如下:

开始啦

我们挑重点一行行解释

line 26 ->根据userID返回一个Observable<Video>,此时返回的video对象都是不完整的

line 28 ->只选取10个

line 30 ->这里我们需要返回一个新的Observable<Video>, 由 line 35- 37的三个Observable zip() 而成

line 39 - 53 ->三个子Observable互相zipWith(),每次zip都在原来video对象上填充需要的member。

line 57 -> 我们在安卓的主线程里面handle收到的新Video对象。

rxjava各种使用场景的更多相关文章

  1. 【腾讯Bugly干货分享】基于RxJava的一种MVP实现

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bfef673c1174283d60bac0 Dev Club 是一个交流移动 ...

  2. 78. Android之 RxJava 详解

    转载:http://gank.io/post/560e15be2dca930e00da1083 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Fli ...

  3. 给 Android 开发者的 RxJava 详解

    我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...

  4. 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 RxJava,相当好

    https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid RX (Reactive Extensions,响 ...

  5. 2.RxJava详解网址http

    RxJava 到底是什么 RxJava 好在哪 API 介绍和原理简析 1) Scheduler 的 API (二) 2) Scheduler 的原理(二) 3) 延伸:doOnSubscribe() ...

  6. 【知识整理】这可能是最好的RxJava 2.x 入门教程(五)

    这可能是最好的RxJava 2.x入门教程系列专栏 文章链接: 这可能是最好的RxJava 2.x 入门教程(一) 这可能是最好的RxJava 2.x 入门教程(二) 这可能是最好的RxJava 2. ...

  7. 彻底搞清楚 RxJava 是什么东西

    其实从rxjava14年出现到现在,我是去年从一个朋友那里听到的,特别是随着现在app项目越来越大,分层越来越不明确的情况下,rxjava出现了,以至于出现了rxandroid.其实如果你了解观察者模 ...

  8. Android框架式编程之RxJava(一):HelloWorld

    Hello World 源码: import android.graphics.Bitmap; import android.graphics.BitmapFactory; import androi ...

  9. android ------- 开发者的 RxJava 详解

    在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github: https://github.com/ReactiveX/RxJava https://github. ...

随机推荐

  1. [转]Jquery Validate用法简介

    原文链接:http://www.cnblogs.com/hejunrex/archive/2011/11/17/2252193.html 正文: 官网地址:http://bassistance.de/ ...

  2. 【多端应用开发系列1.1.1 —— Android:使用新浪API V2】服务器Json数据处理——Json数据概述

    [前白] 一些基础的东西本系列中就不再详述了,争取尽量写些必不可少的技术要点. 由于本系列把Web Service 构建放到了第二部分,Android项目就采用新浪微博API v2作为服务器端. [原 ...

  3. 第一次,触碰Web App项目,栽过的那些坑。

    此项目是一个IPad上的Web App项目,页面的滚动用了最新的IScroll 5.0 插件, 确实是挺潮的. 项目用时 1个月 完成的, 准备今天晚上上线. 这是年前的最后一篇文章了,与众位博友分享 ...

  4. UVA 11354 Bond(最小瓶颈路+倍增)

    题意:问图上任意两点(u,v)之间的路径上,所经过的最大边权最小为多少? 求最小瓶颈路,既是求最小生成树.因为要处理多组询问,所以需要用倍增加速. 先处理出最小生成树,prim的时间复杂度为O(n*n ...

  5. 设置Android默认锁定屏幕旋转

    /********************************************************************************** * 设置Android默认锁定屏 ...

  6. ubuntu-12.04.1-desktop-x64下JDK环境的安装与配置

    1.上oracle官网下载最新的JDK.在这里,我的系统是ubuntu-12.04.1-desktop-amd64,目前位置JDK的最新版本位7u9.jdk-for-linux有两种安装包,一种是rp ...

  7. 《Python 学习手册4th》 第四章 介绍Python对象类型

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容(每天看42页内容,可以保证月底看完此书) ''' ...

  8. 在word中显示漂亮的代码

    在word中粘贴或写代码时,通常得不到想要的格式,可用‘Notepad++’工具实现. 步骤: (1)安装Notepad++软件,把代码粘贴进去,选择菜单栏中的语言,然后选择相应代码语言,如P-> ...

  9. hadoop2.7【单节点】单机、伪分布、分布式安装指导

    问题导读 1.从本文部署实际部署,总结本地模式.伪分布.分布式的区别是什么?2.单机是否是伪分布?3.本地模式是否可以运行mapreduce? 来源:about云 http://www.aboutyu ...

  10. 使用DBCC SHOW_STATISTICS展示索引的统计信息

    在开始之前搭建演示环境: USE master GO SET NOCOUNT ON --创建表结构 IF OBJECT_ID(N'ClassA', N'U') IS NOT NULL DROP TAB ...