前言
Rxjava 很火,不能落伍。这里是Rxjava的开篇,没有晦涩难懂的东西,是最基础的,看明白了这篇就可以进入Rx世界了
RxJava介绍
RxJava尽力做到非常轻巧。它仅关注Observable的抽象和与之相关的高层函数,实现为一个单独的JAR文件。
RxJava的github地址:https://github.com/ReactiveX/RxJava
RxAndroid的github地址:https://github.com/ReactiveX/RxAndroid
在RxJava中,一个实现了Observer接口的对象可以订阅(subscribe)一个Observable 类的实例。订阅者(subscriber)对Observable发射(emit)的任何数据或数据序列作出响应。这种模式简化了并发操作,因为它不需要阻塞等待Observable发射数据,而是创建了一个处于待命状态的观察者哨兵,哨兵在未来某个时刻响应Observable的通知。
Observable
observable(可观察者),它决定什么时候触发事件以及触发怎样的事件。
Observer
observer(观察者),它决定事件触发的时候将有怎样的行为。
Subscriber
Subscriber 是 Observer 的一个实现。
关系图
1.是一个observable 从左到右时间线
2.即将被传递出去的item对象(string[]{ 1,2,3,4,5,6}),既数组中的1~6相当于item
3.即为正常结束标记
4-5虚线标示,表示发射进行
6.应用于Observable的方法 flip
7.Observable 经过变换后的结果
8.一些可观察到的异常终止原因导致的Observable出错 用X 进行标示
二 ,经典的调用举例
Observable<String> observable = Observable.create(mObservableAction);
observable.subscribe(mTextSubscriber);
// 观察事件发生
private Observable.OnSubscribe mObservableAction = new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext(sayMyName()); // 发送事件
subscriber.onCompleted(); // 完成事件
}
};
// 订阅者, 接收字符串, 修改控件
private Subscriber<String> mTextSubscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
mTvText.setText(s); // 设置文字
}
};
Observable(被观察者),它决定什么时候触发事件以及触发怎样的事件。
Observer(观察者),它决定事件触发的时候将有怎样的行为。
Subscriber 是 Observer 的一个实现。
OnSubscribe 当Observable,Observer 通过 subscribe 继续绑定的时候会调用
onSubscribe 中的public void call(Subscriber<? super String> subscriber) {
Subscriber.next()
Subscriber.complete()/error()
}
看到这里会觉得和平时的观察者不一样,怎么是被观察者订阅观察者,不应该反着来吗?按照字面一时反着来可读性更强,不过这里作者是为了给后面 取消注册提供了一个后门,链式调用在这里体现出来了。
public interface Subscription {
void unsubscribe();
boolean isUnsubscribed();
}
那前面的例子
Observable<String> observable = Observable.create(mObservableAction);
Subscription subscription=observable.subscribe(mTextSubscriber);
Subscription.unsubscribe() //这样在不破坏链式调用的基础上实现了,取消订阅
Rxjava 常用功能划分
Operators Categories - 按目录分类的主要操作符列表
Creating 创建操作 - Create/Defer/From/Just/Start/Repeat/Range
Transforming 变换操作 - Buffer/Window/Map/FlatMap/GroupBy/Scan
Filtering 过滤操作 - Debounce/Distinct/Filter/Sample/Skip/Take
Combining 结合操作 - And/StartWith/Join/Merge/Switch/Zip
Error Handling 错误处理 - Catch/Retry
Utility 辅助操作 - Delay/Do/ObserveOn/SubscribeOn/Subscribe
Conditional 条件和布尔操作 - All/Amb/Contains/SkipUntil/TakeUntil
Mathematical 算术和聚合操作 - Average/Concat/Count/Max/Min/Sum/Reduce
Async 异步操作 - Start/ToAsync/StartFuture/FromAction/FromCallable/RunAsync
Connect 连接操作 - Connect/Publish/RefCount/Replay
Convert 转换操作 - ToFuture/ToList/ToIterable/ToMap/toMultiMap
Blocking 阻塞操作 - ForEach/First/Last/MostRecent/Next/Single/Latest
String 字符串操作 - ByLine/Decode/Encode/From/Join/Split/StringConcat
示例代码:
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> observer) {
try {
if (!observer.isUnsubscribed()) {
for (int i = 1; i < 5; i++) {
observer.onNext(i);
}
observer.onCompleted();
}
} catch (Exception e) {
observer.onError(e);
}
}
} ).subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) {
System.out.println("Next: " + item);
}
@Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}
@Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
});
输出:
Next: 1
Next: 2
Next: 3
Next: 4
create方法默认不在任何特定的调度器上执行。
引用:
Rxjava总结 http://gank.io/post/560e15be2dca930e00da1083#toc_5
Rxjava官方 https://www.gitbook.com/book/mcxiaoke/rxdocs/details