## Do
注册一个动作作为原始Observable生命周期事件的一种占位符
![do](https://box.kancloud.cn/302ed263477755cc7d182b4b27356964_1280x620.png)
你可以注册回调,当Observable的某个事件发生时,Rx会在与Observable链关联的正常通知集合中调用它。Rx实现了多种操作符用于达到这个目的。
RxJava实现了很多`Do`操作符的变体。
### doOnEach
![doOnEach](https://box.kancloud.cn/33c66c4903489ccf5a1ea8108f8de892_1280x620.png)
`doOnEach`操作符让你可以注册一个回调,它产生的Observable每发射一项数据就会调用它一次。你可以以`Action`的形式传递参数给它,这个Action接受一个`onNext`的变体`Notification`作为它的唯一参数,你也可以传递一个Observable给`doOnEach`,这个Observable的`onNext`会被调用,就好像它订阅了原始的Observable一样。
* Javadoc: [doOnEach(Action1)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#doOnEach(rx.functions.Action1))
* Javadoc: [doOnEach(Observer)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#doOnEach(rx.Observer))
### doOnNext
![doOnNext](https://box.kancloud.cn/349e88a7c96033d61b1e3814d51709cd_1280x620.png)
`doOnNext`操作符类似于`doOnEach(Action1)`,但是它的Action不是接受一个`Notification`参数,而是接受发射的数据项。
示例代码
```java
Observable.just(1, 2, 3)
.doOnNext(new Action1<Integer>() {
@Override
public void call(Integer item) {
if( item > 1 ) {
throw new RuntimeException( "Item exceeds maximum value" );
}
}
}).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
Error: Item exceeds maximum value
```
### doOnSubscribe
![doOnSubscribe](https://box.kancloud.cn/27e0afb36686545c09d1990bda198fa0_1280x780.png)
`doOnSubscribe`操作符注册一个动作,当观察者订阅它生成的Observable它就会被调用。
* Javadoc: [doOnSubscribe(Action0)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#doOnSubscribe(rx.functions.Action0))
### doOnUnsubscribe
![doOnUnsubscribe](https://box.kancloud.cn/3f7ed5b3955f4a7f0b0a476e9624fae5_1280x620.png)
`doOnUnsubscribe`操作符注册一个动作,当观察者取消订阅它生成的Observable它就会被调用。
* Javadoc: [doOnUnsubscribe(Action0)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#doOnUnsubscribe(rx.functions.Action0))
### doOnCompleted
![doOnCompleted](https://box.kancloud.cn/4eb82c46a7c1d8ce02bf553b2e752356_1280x610.png)
`doOnCompleted` 操作符注册一个动作,当它产生的Observable正常终止调用`onCompleted`时会被调用。
* Javadoc: [doOnCompleted(Action0)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#doOnCompleted(rx.functions.Action0))
### doOnError
![doOnError](https://box.kancloud.cn/bddbf3c74906952a171adb73b67c769f_1280x610.png)
`doOnError` 操作符注册一个动作,当它产生的Observable异常终止调用`onError`时会被调用。
* Javadoc: [doOnError(Action0)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#doOnError(rx.functions.Action1))
### doOnTerminate
![doOnTerminate](https://box.kancloud.cn/eba4554cd0e336ac01d459453784ed37_1280x610.png)
`doOnTerminate` 操作符注册一个动作,当它产生的Observable终止之前会被调用,无论是正常还是异常终止。
* Javadoc: [doOnTerminate(Action0)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#doOnTerminate(rx.functions.Action0))
### finallyDo
![finallyDo](https://box.kancloud.cn/c3743dfb5763ac62c496e2cbd87acf04_1280x620.png)
`finallyDo` 操作符注册一个动作,当它产生的Observable终止之后会被调用,无论是正常还是异常终止。
* Javadoc: [finallyDo(Action0)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#finallyDo(rx.functions.Action0))
- ReactiveX
- Observables
- Single
- Subject
- Scheduler
- Operators
- 创建操作
- Create
- Defer
- Empty/Never/Throw
- From
- Interval
- Just
- Range
- Repeat
- Start
- Timer
- 变换操作
- Buffer
- FlatMap
- GroupBy
- Map
- Scan
- Window
- 过滤操作
- Debounce
- Distinct
- ElementAt
- Filter
- First
- IgnoreElements
- Last
- Sample
- Skip
- SkipLast
- Take
- TakeLast
- 结合操作
- And/Then/When
- CombineLatest
- Join
- Merge
- StartWith
- Switch
- Zip
- 错误处理
- Catch
- Retry
- 辅助操作
- Delay
- Do
- Materialize/Dematerialize
- ObserveOn
- Serialize
- Subscribe
- SubscribeOn
- TimeInterval
- Timeout
- Timestamp
- Using
- To
- 条件和布尔操作
- All/Contains/Amb
- DefaultIfEmpty
- SequenceEqual
- SkipUntil/SkipWhile
- TakeUntil/TakeWhile
- 算术和聚合操作
- Average/Concat/Reduce
- Max/Min/Count/Sum
- 异步操作
- 连接操作
- Connect
- Publish
- RefCount
- Replay
- 转换操作
- 阻塞操作
- 字符串操作
- 按字母顺序的操作符列表
- RxJava文档和教程
- RxJava入门指南
- RxJava使用示例
- 实现自定义操作符
- 自定义插件
- Backpressure
- 错误处理
- Android模块
- 参与开发
- 补充阅读材料