<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                首先說明下面這個是看[扔物線大大](http://gank.io/post/560e15be2dca930e00da1083)的學習筆記,請直接前往[ 這里看極其詳細的入門版](http://gank.io/post/560e15be2dca930e00da1083)這里先給出這個歌開源庫的[github地址](https://github.com/ReactiveX) ### 前言 當前RxJava可是越來越火,也越來越多的人開始學習RxJava,越來越多的項目開始使用RxJava,那么我們就有必要來學習下RxJava。 ### RxJava是什么 ### Rx是什么 RX(Reactive Extensions)原來是由微軟提出的一個綜合了異步和機遇事件驅動的庫包,使用開觀察序列和LINQ-style查詢操作。那么RX有什么特點呢?Rx最顯著的特性是使用可觀察集合(Observable Collection)來達到集成異步(composing asynchronous)和基于事件(event-based)的編程的效果。當然,RX當中的序列為數據流。這些我們不多說了。[RX介紹](http://www.jdon.com/45833)。 ### RxJava是什么 RxJava是由ReactiveX開發并維護的一個開源項目。先來看看ReactiveX的介紹。 ![](https://box.kancloud.cn/2016-04-08_570768081c143.jpg "") 很明顯異步編程,接下來我們在看看RxJava的介紹。 ![](https://box.kancloud.cn/2016-04-08_5707680842b5e.jpg "") 一個在 Java VM 上使用可觀測的序列來組成異步的、基于事件的程序的庫。有點抽象,這句話說白了就是觀察者模式、異步、事件流。RxJava是一種響應式編程。[響應式編程](http://www.tuicool.com/articles/BBNRRf) - 觀察者模式,舉個例子?比如說你睡午覺了,舍友不睡,你就說某某,到了幾點叫我,然后時間一到,他叫你起床了,這就是個很簡單的例子。關于觀察者模式,就不細說了。 - 異步 什么?你不知道異步是什么?那你怎么學編程的。異步就是不用等待結果,即可繼續執行,這里就又牽出一個回調的概念,不多少了、 - 事件流 就是一系列有序事件 ### RxJava怎么用 現在AS中引入。 ~~~ compile 'io.reactivex:rxjava:1.0.16' compile 'io.reactivex:rxandroid:1.0.1' ~~~ 這里引入RxAndroid的原因是 這里是android程序。 ### 1.Observer觀察者 有下面2中方式。 ~~~ public static Observer getObserver(){ Observer<String> observer = new Observer<String>() { @Override public void onCompleted() { Log.e(TAG, "onCompleted: " ); } @Override public void onError(Throwable e) { Log.e(TAG, "onError: "+e.getMessage() ); } @Override public void onNext(String s) { Log.e(TAG, "onNext: "+s ); } }; return observer; } ~~~ ~~~ public static Observer getSubscriber(){ Subscriber<String> subscriber = new Subscriber<String>() { @Override public void onCompleted() { Log.e(TAG, "onCompleted: " ); } @Override public void onError(Throwable e) { Log.e(TAG, "onError: " ); } @Override public void onNext(String s) { Log.e(TAG, "onNext: "+s ); } }; return subscriber; } ~~~ 2者的關系如下 ![](https://box.kancloud.cn/2016-04-08_5707680858e96.jpg "") - onCompleted 事件流結束 - onError 出錯 - onNext 事件正常 這三個就是事件發生時觸發的回調。在android中,回調一般發生在UI線程。 ### 2.Observable被觀察者 Observable的源碼1w+行,我們一般通過下面三種方式來創建被觀察者。 #### 2.1.Create ~~~ Observable observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("hello"); subscriber.onNext("world"); subscriber.onNext("my name is quanshijie"); subscriber.onCompleted(); } }); ~~~ 其中的onNext就是一個一個的事件。這種方式必須以onCompleted結束。 #### 2.2.just ~~~ Observable observable = Observable.just("hello", "world", "my name is quanshijie"); ~~~ just中就是一個一個的事件 #### 2.3.form ~~~ String[] words = {"hello","world","my name is quanshijie"}; Observable observable = Observable.from(words); ~~~ ### 3.Subscribe 訂閱 Observable.subscribe(Observable或者Subscriber) 也可采用如下方法。 ~~~ observable.subscribe(new Action1<String>() { @Override public void call(String s) { Log.e(TAG, "call: " + s); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { Log.e(TAG, "call: " + throwable.getMessage()); } }, new Action0() { @Override public void call() { Log.e(TAG, "call: "+"completed" ); } } ); ~~~ ### 4.線程調度 在android當中,線程之間切換是很頻繁的,UI線程不能進行耗時操作,而android中耗時操作還是很多的。我們來看下如何進行線程調度。看如下例子。 ~~~ Observable.just(1,2,3,4) .subscribeOn(Schedulers.io()) //subscribe發生在IO線程 .observeOn(AndroidSchedulers.mainThread()) //指定回調發生在主線程 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.e(TAG, "call: " + integer); } }); ~~~ 我們假設1,2,3,4為耗時操作,如操作數據庫或者網絡請求或者其他,我們通過subscribeOn來指定這些事件發生的線程,通過observeOn來指定回調的線程, - Scheduler.io() io線程 - Scheduler.newThread 新線程 - Scheduler.immediate 當前線程 - AndroidSchedulers.mainThread() androidUI線程 ### 5.變換 #### 5.1 map變換 ~~~ Observable.just("xxx") .map(new Func1<String, Bitmap>() { @Override public Bitmap call(String s) { return BitmapFactory.decodeFile(s); } }) .subscribe(new Action1<Bitmap>() { @Override public void call(Bitmap bitmap) { // showBitmap(bitmap); } }); ~~~ Funcx函數來實現類型變換。這里是一對一轉換 #### 5.2 flatMap轉換 實現多對多轉化。以拋物線的例子來看。 ~~~ Student[] students = ...; Subscriber<Course> subscriber = new Subscriber<Course>() { @Override public void onNext(Course course) { Log.d(tag, course.getName()); } ... }; Observable.from(students) .flatMap(new Func1<Student, Observable<Course>>() { @Override public Observable<Course> call(Student student) { return Observable.from(student.getCourses()); } }) .subscribe(subscriber); ~~~ ### RxJava何時用 說了那么多RxJava的用法,然而并沒有什么亂用。我們說那么多,到頭來沒什么用豈不是很二。用法請移步[大頭鬼RxJava使用小結](http://blog.csdn.net/lzyzsd/article/details/50120801) 或者[github上的這個rxdemo](https://github.com/kaushikgopal/RxJava-Android-Samples) ### 總結 若是RxJava+retrofit+lambda+RxBinding等其他現成的Observable,會使我們的代碼變得簡潔干凈,條理清晰。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看