## Start
返回一个Observable,它发射一个类似于函数声明的值
![Start](https://box.kancloud.cn/3f1cc78d69708d39db60c3dcdabe7051_1280x520.png)
编程语言有很多种方法可以从运算结果中获取值,它们的名字一般叫`functions, futures, actions, callables, runnables`等等。在`Start`目录下的这组操作符可以让它们表现得像Observable,因此它们可以在Observables调用链中与其它Observable搭配使用。
`Start`操作符的多种RxJava实现都属于可选的`rxjava-async`模块。
`rxjava-async`模块包含`start`操作符,它接受一个函数作为参数,调用这个函数获取一个值,然后返回一个会发射这个值给后续观察者的Observable。
注意:这个函数只会被执行一次,即使多个观察者订阅这个返回的Observable。
### toAsync
![toAsync](https://box.kancloud.cn/190e7a30ad5e35d453aea3cc1c44d339_1280x620.png)
`rxjava-async`模块还包含这几个操作符:`toAsync`, `asyncAction`, 和`asyncFunc`。它们接受一个函数或一个Action作为参数。
对于函数(functions),这个操作符调用这个函数获取一个值,然后返回一个会发射这个值给后续观察者的Observable(和`start`一样)。对于动作(Action),过程类似,但是没有返回值,在这种情况下,这个操作符在终止前会发射一个`null`值。
注意:这个函数或动作只会被执行一次,即使多个观察者订阅这个返回的Observable。
### startFuture
![startFuture](https://box.kancloud.cn/93e59953ab78483d7419c99e6c40132a_1280x480.png)
`rxjava-async`模块还包含一个`startFuture`操作符,传递给它一个返回`Future`的函数,`startFuture`会立即调用这个函数获取`Future`对象,然后调用`Future`的`get()`方法尝试获取它的值。它返回一个发射这个值给后续观察者的Observable。
### deferFuture
![deferFuture](https://box.kancloud.cn/7cec756b73b79819a0b700a878bf0f1b_1280x680.png)
`rxjava-async`模块还包含一个`deferFuture`操作符,传递给它一个返回`Future`的函数(这个`Future`返回一个`Observable`),`deferFuture`返回一个Observable,但是不会调用你提供的函数,直到有观察者订阅它返回的Observable。这时,它立即调用`Future`的`get()`方法,然后镜像发射`get()`方法返回的Observable发射的数据。
用这种方法,你可以在Observables调用链中包含一个返回Observable的`Future`对象。
### fromAction
![fromAction](https://box.kancloud.cn/2c266f158eadd655218b6099abbee510_1280x620.png)
`rxjava-async`模块还包含一个`fromAction`操作符,它接受一个`Action`作为参数,返回一个Observable,一旦Action终止,它发射这个你传递给`fromAction`的数据。
### fromCallable
![fromCallable](https://box.kancloud.cn/2c266f158eadd655218b6099abbee510_1280x620.png)
`rxjava-async`模块还包含一个`fromCallable`操作符,它接受一个`Callable`作为参数,返回一个发射这个`Callable`的结果的Observable。
### fromRunnable
![fromRunnable](https://box.kancloud.cn/640a2cd8c83f20bf2bbd811e57b2dec7_1280x620.png)
`rxjava-async`模块还包含一个`fromRunnable`操作符,它接受一个`Runnable `作为参数,返回一个Observable,一旦Runnable终止,它发射这个你传递给`fromRunnable`的数据。
### forEachFuture
![forEachFuture](https://box.kancloud.cn/c98169de67dc2d93a5a7d9580e983c7f_1280x830.png)
`rxjava-async`模块还包含一个`forEachFuture`操作符。它其实不算`Start`操作符的一个变体,而是有一些自己的特点。你传递一些典型的观察者方法(如onNext, onError和onCompleted)给它,Observable会以通常的方式调用它。但是`forEachFuture`自己返回一个`Future`并且在`get()`方法处阻塞,直到原始Observable执行完成,然后它返回,完成还是错误依赖于原始Observable是完成还是错误。
如果你想要一个函数阻塞直到Observable执行完成,可以使用这个操作符。
### runAsync
`rxjava-async`模块还包含一个`runAsync`操作符。它很特殊,返回一个叫做`StoppableObservable `的特殊Observable。
传递一个`Action`和一个`Scheduler`给`runAsync`,它返回一个使用这个`Action`产生数据的`StoppableObservable`。这个`Action`接受一个`Observable`和一个`Subscription`作为参数,它使用`Subscription`检查`unsubscribed`条件,一旦发现条件为真就立即停止发射数据。在任何时候你都可以使用`unsubscribe`方法手动停止一个`StoppableObservable`(这会同时取消订阅与这个`StoppableObservable`关联的`Subscription`)。
由于`runAsync`会立即调用`Action`并开始发射数据,在你创建StoppableObservable之后到你的观察者准备好接受数据之前这段时间里,可能会有一部分数据会丢失。如果这不符合你的要求,可以使用`runAsync`的一个变体,它也接受一个`Subject`参数,传递一个`ReplaySubject`给它,你可以获取其它丢失的数据了。
在RxJava中还有一个版本的`From`操作符可以将Future转换为Observable,与`start`相似。
- 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模块
- 参与开发
- 补充阅读材料