RxJava
2015-11-17 09:24:15 0 举报
AI智能生成
RxJava介绍
作者其他创作
大纲/内容
Rx设计模式
被观察者Observable生产内容,订阅者Subscriber消费内容。后者按需向前者发起订阅,前者仅在有订阅后按需生产
pk观察者模式: 被观察者不生成发出任何内容,直到被至少一个订阅者明确订阅后。
被观察者
生产内容数量不限:0-无穷大
一定有个结果:成功完成,或者报告错误
订阅者
onNext()接收消费内容,1或多次
onComplete()接收生产完成事件
onError()接收报告错误事件
交互
启动,订阅者明确订阅被观察者
被观察者被订阅时接收到订阅者(接口对象)
被观察者每生产出一项内容回调订阅者接口onNext()
被观察者全部生产顺利完成后回调订阅者接口onComplete()
被观察者任何时候遇到错误是回调订阅者接口onError(),生产结束。
(订阅者接口onNext()据被观察者会生产内容数量被调次数1+,onComplete或者onError只有一个被调用,且只有一次
Hello, world
目标
被观察者Observable,被订阅后1.生产发出"Hello, world!"字符串 2. 结束生产过程
订阅者Subscriber 1. 接收的"Hello, world!"后打印出来 2. 接收生产成功完成的事件不做事 3. 接收生产遇到错误的事件不做事
源码v1
Observable myObservable = Observable.create(
new Observable.OnSubscribe() {
@Override
public void call(Subscriber super String> sub) {
sub.onNext("Hello, world!");
sub.onCompleted();
}
}
);
Subscriber mySubscriber = new Subscriber() {
@Override
public void onNext(String s) { System.out.println(s); }
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
};
myObservable.subscribe(mySubscriber);
// Outputs "Hello, world!"
注:当被观察者被订阅后,调用订阅者的onNext()和onComplete()方法,
订阅者打印"Hello, world!”. 满足目标,但充斥着太多的非核心代码。
源码v2-RxJava简化
Observable myObservable = Observable.just("Hello, world!");
Action1 onNextAction = new Action1() {
@Override
public void call(String s) {
System.out.println(s);
}
};
myObservable.subscribe(onNextAction);
// Outputs "Hello, world!"
注:1. RxJava内建很多方法来简化创建各类Observable对象创建,
本例Observable.just()的被观察者只生产一个内容后即结束。2.
订阅函数最多可接收三个Action类型的参数对象,分别实现订阅
者的onNext, onComplete, onError三个接口,本例只需要第一个
Action1的onNext接口
源码v3-消除局部变量
Observable.just("Hello, world!")
.subscribe(new Action1() {
@Override
public void call(String s) {
System.out.println(s);
}
});
注:创建被观察者-订阅-接收,一气呵成。
源码v4-java8的lambdas
Observable.just("Hello, world!").subscribe(s -> System.out.println(s));
注:这个无尽鞭笞代码的特性,也是醉了, 那么,问题来了,
Android还不能用Java8,怎么搞?别去山东找蓝翔了,到
github搜gradle插件retrolambda也是够了
Hello,world2
目标
唯易不易,需要扩展程序
新增case的支持:打印Hello,world! --funyoung
可选case:兼容原无签名的实现
源码v1-改Observable
可读性
配色
常用背景颜色和字搭配
白底黑字;蓝底白字;灰底白字;黑底白字
多媒体设计七个原则
多媒体认知原则
空间接近原则
时间接近原则
一致性原则
通道原则
冗余原则
个体差异原则
热捧RxJava
受世界Android开发者热捧
转变对于习惯了函数式编程的人,开始总是有点难
此处风雨过后有阳光有彩虹
RxJava操作符
基础背景
了解RxJava的Observable+Subscrber设计模式
读懂java8新加入的lambda表达式
知道RxJava在Observable和Subscriber对象之间可以级联操作符变换输入输出的内容
推荐:RxJava基础
新的目标
已经有查询函数,给入一个字符串能返回包含url的被观察者列表
// Returns a List of website URLs based on a text search
Observable
- > query(String text);
需要构建健壮的字符串搜索并显示结果的系统
SearchUrl源码v0
query("Hello, world!")
.subscribe(urls -> {
for (String url : urls) {
System.out.println(url);
}
});
注:订阅者直接对接被观察者生产发出的内容,任何修改需求都导致订阅者修改. 推荐指数:0
提示:没有独立的中间数据变换环节,之前看过酷炫的map()技巧被抛弃了!还有for循环
SearchUrl源码v1-嵌套丑码
query(“Hello, world!”)
.subscribe(urls -> {
Observable.from(urls)
.subscribe(url -> System.out.println(url));
});
注:去掉for循环却引入了观察订阅嵌套,依旧难于修改,丑陋更甚。推荐指数<0
提示:虽然RxJava提供Observable.from可以把列表分解成单个被观察者,此场合不合适。
SearchUrl源码v2-美即简单
query(“Hello, world!”)
.flatMap(new Func1
- , Observable
注:flatMap就像Observable.from()一样把一个列表拆分成一系列单个内容项依次给后面的订阅者
SearchUrl源码v3-lambda
query(“Hello, world!”)
.flatMap(urls -> Observable.from(urls))
.subscribe(url -> System.out.println(url));
注:flatMap这部分应该是RxJava里最难以理解的部分,参透时则全身通畅
SearchUrl源码v4-打印标题
// 已有查url的标题函数Returns the title of a website, or null if 404
Observable getTitle(String URL);
query(“Hello, world!”)
.flatMap(urls -> Observable.from(urls))
.flatMap(new Func1
- , Observable
注:URL列表劈成单个的项,在到达订阅者前调用获取标题函数。
SearchUrl源码v5-标题lambdas
query(“Hello, world!”)
.flatMap(urls -> Observable.from(urls))
.flatMap(url -> getTitle(url)))
.subscribe(title -> System.out.println(title));
注:①疯狂地组合多个方法,每个都独立返回Observabe对象,酷毙了。
②两个API调用可以组合在一个调用链里,可组API数量无限,完全对
API串联回调嵌套深恶痛绝了。
SearchUrl源码v6-过滤空标题项
query(“Hello, world!”)
.flatMap(urls -> Observable.from(urls))
.flatMap(url -> getTitle(url)))
.filter(title -> title != null)
.subscribe(title -> System.out.println(title));
注:filter判断布尔求值为真时返回原数据项
分支主题 6
0 条评论
下一页