RxJava是 [ReactiveX](http://reactivex.io/) 在JVM上的一個實現,ReactiveX使用Observable序列組合異步和基于事件的程序。更多關于ReactiveX的資料,可以查看 [ReactiveX 介紹](../docs/Intro.md) 頁面。
## RxJava介紹
### RxJava 是輕量級的
RxJava盡力做到非常輕巧。它僅關注Observable的抽象和與之相關的高層函數,實現為一個單獨的JAR文件。
### RxJava 是一個多語言實現
RxJava 支持Java 6或者更新的版本,以及其它的JVM語言如 [Groovy](https://github.com/ReactiveX/RxGroovy), [Clojure](https://github.com/ReactiveX/RxClojure), [JRuby](https://github.com/ReactiveX/RxJRuby), [Kotlin](https://github.com/ReactiveX/RxKotlin) 和 [Scala](https://github.com/ReactiveX/RxScala)。RxJava 可用于更多的語言環境,而不僅僅是Java和Scala,而且它致力于尊重每一種JVM語言的習慣。
### RxJava 第三方庫
下面是可與RxJava協作的第三方庫:
* [Hystrix](https://github.com/Netflix/Hystrix/wiki/How-To-Use#wiki-Reactive-Execution) - 用于分布式系統的一個延時和容錯處理框架
* [Camel RX](http://camel.apache.org/rx.html) - 一個用于[Apache Camel](http://camel.apache.org/components.html) 的 RxJava 兼容層
* [rxjava-http-tail](https://github.com/myfreeweb/rxjava-http-tail) - 讓你可以跟蹤HTTP日志,就像使用 `tail -f` 一樣
* [mod-rxvertx - Extension for VertX](https://github.com/vert-x/mod-rxvertx) - 使用 RxJava 封裝的VertX庫
* [rxjava-jdbc](https://github.com/davidmoten/rxjava-jdbc) - 使用RxJava流式處理JDBC連接,還支持語句的函數式組合
* [rtree](https://github.com/davidmoten/rtree) - 使用RxJava實現的一個純內存的可變的R-tree和R*-tree
## 使用指南
你可以在Maven Central [http://search.maven.org](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22io.reactivex%22%20AND%20a%3A%22rxjava%22) 找到用于Maven, Ivy, Gradle, SBT和其它構建工具需要的二進制文件和依賴信息.
Maven示例:
```xml
<dependency>
<groupId>io.reactivex</groupId>
<artifactId>rxjava</artifactId>
<version>1.0.10</version>
</dependency>
```
Ivy示例:
```xml
<dependency org="io.reactivex" name="rxjava" rev="1.0.10" />
```
SBT示例:
```scala
libraryDependencies += "com.netflix.rxjava" % "rxjava-scala" % "1.0.10"
```
Gradle示例:
```groovy
compile 'io.reactivex:rxjava:1.0.10'
```
如果你沒有使用構建系統,想直接下載JAR文件的話可以在這里找到:
<https://repo1.maven.org/maven2/io/reactivex/>
## 編譯構建
檢出和構建RxJava的源碼,使用以下命令:
```
$ git clone git@github.com:ReactiveX/RxJava.git
$ cd RxJava/
$ ./gradlew build
```
要執行一個完整的構建,使用這個命令:
```
$ ./gradlew clean build
```
構建命令的輸出大概是這樣的:
```
$ ./gradlew build
:rxjava:compileJava
:rxjava:processResources UP-TO-DATE
:rxjava:classes
:rxjava:jar
:rxjava:sourcesJar
:rxjava:signArchives SKIPPED
:rxjava:assemble
:rxjava:licenseMain UP-TO-DATE
:rxjava:licenseTest UP-TO-DATE
:rxjava:compileTestJava
:rxjava:processTestResources UP-TO-DATE
:rxjava:testClasses
:rxjava:test
:rxjava:check
:rxjava:build
BUILD SUCCESSFUL
Total time: 30.758 secs
```
執行完整的構建的話,你會看到單元測試的執行,輸出類似于這樣:
```
> Building > :rxjava:test > 91 tests completed
```
## 故障排除
有一位開發者上報了下面這個錯誤:
> Could not resolve all dependencies for configuration ':language-adaptors:rxjava-scala:provided'
他在從`.gradle/caches`和`.m2/repository/org/scala-lang/`移除了舊版本的 `scala-library`之后解決了這個問題,然后執行了一次完整構建。<a href="https://gist.github.com/jaceklaskowski/9496058">(查看詳細信息)</a>
在構建RxJava時你可能會遇到下面的錯誤:
> Failed to apply plugin [id 'java']
> Could not generate a proxy class for class nebula.core.NamedContainerProperOrder.
這是JVM的問題,詳細信息可以參考 [GROOVY-6951](https://jira.codehaus.org/browse/GROOVY-6951) 。如果遇到這個問題,可以在構建RxJava之前執行 `export GRADLE_OPTS=-noverify`,或者升級你機器上的JDK。
- 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模塊
- 參與開發
- 補充閱讀材料