RxJava入门实践①

JoseBeckham 8年前
   <p>最近大家都在学习RXJAVA,作为有理想(mei shi gan)的程序员,RxJava还是沈有必要学习下的。</p>    <p>RXJAVA地址: <a href="/misc/goto?guid=4958865750209621132" rel="nofollow,noindex">https://github.com/ReactiveX/RxJava</a></p>    <p><a href="http://www.open-open.com/lib/view/open1460527305158.html" rel="nofollow,noindex">0.什么是观察者模式</a></p>    <h2>1.RXJAVA是什么</h2>    <p>RXJAVA是基于ReactiveX在java上的发展和延伸,是一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库。</p>    <h3>什么是ReactiveX</h3>    <p>微软给的定义是,Rx是一个函数库,让开发者可以利用可观察序列和LINQ风格查询操作符来编写异步和基于事件的程序,使用Rx,开发者可以用Observables表示异步数据流,用LINQ操作符查询异步数据流, 用Schedulers参数化异步数据流的并发处理,Rx可以这样定义:Rx = Observables + LINQ + Schedulers。</p>    <p>ReactiveX.io给的定义是,Rx是一个使用可观察数据流进行异步编程的编程接口,ReactiveX结合了观察者模式、迭代器模式和函数式编程的精华。</p>    <h3>ReactiveX的应用</h3>    <p>很多公司都在使用ReactiveX,例如Microsoft、Netflix、Github、Trello、SoundCloud。</p>    <h3>ReactiveX宣言</h3>    <p>ReactiveX不仅仅是一个编程接口,它是一种编程思想的突破,它影响了许多其它的程序库和框架以及编程语言。</p>    <h2>Rx模式</h2>    <h3>使用观察者模式</h3>    <ul>     <li>创建:Rx可以方便的创建事件流和数据流</li>     <li>组合:Rx使用查询式的操作符组合和变换数据流</li>     <li>监听:Rx可以订阅任何可观察的数据流并执行操作</li>    </ul>    <h3>简化代码</h3>    <ul>     <li>函数式风格:对可观察数据流使用无副作用的输入输出函数,避免了程序里错综复杂的状态</li>     <li>简化代码:Rx的操作符通通常可以将复杂的难题简化为很少的几行代码</li>     <li>异步错误处理:传统的try/catch没办法处理异步计算,Rx提供了合适的错误处理机制</li>     <li>轻松使用并发:Rx的Observables和Schedulers让开发者可以摆脱底层的线程同步和各种并发问题</li>    </ul>    <h3>使用Observable的优势</h3>    <p>Rx扩展了观察者模式用于支持数据和事件序列,添加了一些操作符,它让你可以声明式的组合这些序列,而无需关注底层的实现:如线程、同步、线程安全、并发数据结构和非阻塞IO。</p>    <p>Observable通过使用最佳的方式访问异步数据序列填补了这个间隙</p>    <table>     <thead>      <tr>       <th> </th>       <th>单个数据</th>       <th>多个数据</th>      </tr>     </thead>     <tbody>      <tr>       <td>同步</td>       <td>T getData()</td>       <td>Iterable<T> getData()</td>      </tr>      <tr>       <td>异步</td>       <td>Future<T> getData()</td>       <td>Observable<T> getData()</td>      </tr>     </tbody>    </table>    <p>Rx的Observable模型让你可以像使用集合数据一样操作异步事件流,对异步事件流使用各种简单、可组合的操作。</p>    <p>Observable可组合</p>    <p>对于单层的异步操作来说,Java中Future对象的处理方式是非常简单有效的,但是一旦涉及到嵌套,它们就开始变得异常繁琐和复杂。使用Future很难很好的组合带条件的异步执行流程(考虑到运行时各种潜在的问题,甚至可以说是不可能的),当然,要想实现还是可以做到的,但是非常困难,或许你可以用 Future.get() ,但这样做,异步执行的优势就完全没有了。从另一方面说,Rx的Observable一开始就是为组合异步数据流准备的。</p>    <p>Observable更灵活</p>    <p>Rx的Observable不仅支持处理单独的标量值(就像Future可以做的),也支持数据序列,甚至是无穷的数据流。 Observable 是一个抽象概念,适用于任何场景。Observable拥有它的近亲Iterable的全部优雅与灵活。</p>    <p>Observable是异步的双向push,Iterable是同步的单向pull,对比:</p>    <table>     <thead>      <tr>       <th>事件</th>       <th>Iterable(pull)</th>       <th>Observable(push)</th>      </tr>     </thead>     <tbody>      <tr>       <td>获取数据</td>       <td>T next()</td>       <td>onNext(T)</td>      </tr>      <tr>       <td>异常处理</td>       <td>throws Exception</td>       <td>onError(Exception)</td>      </tr>      <tr>       <td>任务完成</td>       <td>!hasNext()</td>       <td>onCompleted()</td>      </tr>     </tbody>    </table>    <p>Observable无偏见</p>    <p>Rx对于对于并发性或异步性没有任何特殊的偏好,Observable可以用任何方式实现,线程池、事件循环、非阻塞IO、Actor模式,任何满足你的需求的,你擅长或偏好的方式都可以。无论你选择怎样实现它,无论底层实现是阻塞的还是非阻塞的,客户端代码将所有与Observable的交互都当做是异步的。</p>    <p>来自: <a href="/misc/goto?guid=4959670527778842797" rel="nofollow">http://blog.flyou.ren/?p=264</a></p>