RxJava 最简单的入门

celuda 5年前
   <h2><strong>一,RxJava的概述</strong></h2>    <p><strong>1.0 什么是RxJava</strong></p>    <p>要知道RxJava是什么,那么你应该先去了解一下Rx。Rx的全称是Reactive Extensions,直译过来就是响应式扩展。Rx基于观察者模式,他是一种编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流。</p>    <p>那么到底什么是RxJava呢?我对它的定义是:RxJava本质上是一个异步操作库,是一个能让你用极其简洁的逻辑去处理繁琐复杂任务的 异步 事件库。</p>    <p><strong>1.1 RxJava的好处</strong></p>    <ol>     <li>规范项目成员的代码实现</li>     <li>让复杂的逻辑变得有条理性</li>    </ol>    <p><strong>1.2 必须要了解的观察者模式</strong></p>    <p>TODO This</p>    <p>在这个事件中, 台灯作为观察者,开关作为被观察者,台灯透过电线来观察开关的状态来并做出相应的处理</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/6d47c3fafb124576fc12e1206824512b.png"></p>    <p style="text-align:center">观察者.png</p>    <p><strong>1.3 RxJava的基本元素</strong></p>    <ol>     <li>Observable :被观察者,事件源</li>     <li>Subscriber/Observer :观察者</li>     <li>OnSubscribe :一个接口类,是连接被观察者和观察者的桥梁,另外要说明的是onSubscribe是Observable的一个局部变量</li>    </ol>    <h2><strong>二,RxJava的简单使用</strong></h2>    <p><strong>2.1 使用步骤</strong></p>    <ol>     <li> <p>导包: 在build.gradle中导入如下:</p> <pre>  <code class="language-java">compile 'io.reactivex:rxandroid:1.2.0'   compile 'io.reactivex:rxjava:1.1.5'</code></pre> </li>     <li>创建 被观察者(Observerable<>)对象</li>     <li>创建 观察者 (Subscriber或者Observer)对象</li>     <li>通过订阅:把观察者和被观察者进行相互关联</li>    </ol>    <p><strong>2.2 最简单的实例演示</strong></p>    <p>TODO This</p>    <h2><strong>三,RxJava的操作符详解</strong></h2>    <p><strong>3.1 创建操作:创建Observable(被观察者)的操作符</strong></p>    <ol>     <li><strong>create</strong> : 使用OnSubscribe从头创建一个Observable,这种方法比较简单。需要注意的是,使用该方法创建时,建议在OnSubscribe#call方法中检查订阅状态,以便及时停止发射数据或者运算。</li>     <li><strong>from</strong> :将一个Iterable, 一个Future, 或者一个数组,内部通过代理的方式转换成一个Observable。代码如下: <pre>  <code class="language-java">String[] array = {"hello", "rxJava"};   Observable<String> observable = Observable.from(array);</code></pre> </li>     <li> <p>just:将一个或多个对象转换成发射这个或这些对象的一个Observable。如果是单个对象,内部创建的是ScalarSynchronousObservable对象。如果是多个对象,则是调用了from方法创建。</p> <pre>  <code class="language-java">Observable<String> observable1 = Observable.just("hello", "rxjava");</code></pre> </li>     <li><strong>empty</strong> : 创建一个什么都不做直接通知完成的Observable</li>     <li><strong>error</strong> : 创建一个什么都不做直接通知错误的Observable</li>     <li><strong>never</strong> : 创建一个什么都不做的Observable</li>    </ol>    <p><strong>3.2变换操作符:</strong></p>    <ol>     <li> <p><strong>map : 所谓变换,就是将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列。</strong></p> <pre>  <code class="language-java">//举个栗子   //比如被观察者产生的事件中只有图片文件路径;但是在观察者这里只想要bitmap,那么就需要**类型变换**。    Observable.create(new Observable.just(getFilePath()) //使用map操作来完成类型转换    .map(new Func1<String, Bitmap>() {              @Override public Bitmap call(String s) { //显然自定义的createBitmapFromPath(s)方法,是一个极其耗时的操作                        return createBitmapFromPath(s); } })    .subscribe( //创建观察者,作为事件传递的终点处理事件               new Subscriber<Bitmap>() {                      @Override                     public void onCompleted() {                                                                               Log.d("DDDDDD","结束观察...\n");                       }                     @Override                      public void onError(Throwable e) {                              //出现错误会调用这个方法                      }                    @Override                    public void onNext(Bitmap s) {                              //处理事件 showBitmap(s)                   }          );</code></pre> </li>    </ol>    <p>未完待续。。。</p>    <h2><strong>四,关于异步(线程调度)Scheduler</strong></h2>    <p><strong>4.1 线程环境</strong></p>    <p><img src="https://simg.open-open.com/show/85953617e57eef4eb196ecd287964fcb.png"></p>    <p style="text-align:center">RxJava的线程.png</p>    <pre>  <code class="language-java">Observable.just(1, 2, 3, 4) // IO 线程,由 subscribeOn() 指定           .subscribeOn(Schedulers.io())           .observeOn(Schedulers.newThread())          .map(mapOperator) // 新线程,由 observeOn() 指定           .observeOn(Schedulers.io()) .map(mapOperator2) // IO 线程,由 observeOn() 指定           .observeOn(AndroidSchedulers.mainThread)           .subscribe(subscriber); // Android 主线程,由 observeOn() 指定</code></pre>    <ul>     <li>这里注意的是: 有两个重要的api      <ul>       <li>subscribeOn( )</li>       <li>observeOn( )</li>      </ul> </li>     <li>需要注意的是(对于初学者,先了解到此就足够使用了):      <ul>       <li>subscribeOn()它指示Observable在一个指定的调度器上 <strong>创建</strong> (只作用于被观察者创建阶段)。只能指定一次,如果指定多次则以第一次为准</li>       <li>observeOn()指定在事件传递(加工变换)和最终被处理(观察者)的发生在哪一个调度器。可指定多次,每次指定完都在下一步生效。</li>      </ul> </li>    </ul>    <p> </p>    <p>来自:http://www.jianshu.com/p/1c5800b3ff39</p>    <p> </p>