淺談RxJava

porterking發表於2018-02-01

淺談RxJava

一年前,自己搭建專案框架的時候,就已經接觸用過RxJava,並且還和Retrofit結合一起使用。然而卻並不清楚RxJava,到底是個啥子東西,只知道按摸就樣的用著。網上有篇文章對RxJava介紹很詳細 拋物線大神  ,一年前看這篇文章和現在看,有不同的收穫吧。

那到底啥是RxJava? 官方介紹

a library for composing asynchronous and event-based programs by using observable sequences.

It extends the observer pattern to support sequences of data/events and adds operators 
that allow you to compose sequences together declaratively 
while abstracting away concerns about things
 like low-level threading, synchronization, thread-safety and concurrent data structures.
複製程式碼

英語捉急,只能藉助有道爸爸:

使用可觀察的序列來編寫非同步和基於事件的程式的庫。
它擴充套件了觀察者模式,以支援資料/事件的序列,並新增操作符,
使您能夠在抽象地消除對低層次執行緒、同步、執行緒安全和併發資料結構的關注時,以宣告的方式組合這些序列。
複製程式碼

還是看不懂,看來語文也捉急。 網上說的最多的就是Rxjava的非同步性,當然同樣的可以實現非同步常規操作,大多用AsyncTask / Handler 。既然市面上那麼多人推崇Rxjava,那它肯定有存在的必要。

廢話也不講,慢慢了解它 要學習Rxjava,不得不知道這幾個物件:Observable/ Subscriber(可觀察者,即被觀察者,這兩者區別,後者增加訂閱和取消訂閱監聽)、 Observer (觀察者)、 subscribe (訂閱)、事件。

這幾個物件的關係其實就和onClick類似,抽象的描述可以比喻:Observable 就像是直播平臺的主播,Observer 則是使用者,通過使用者訂閱主播這個動作,兩者達成了一個聯絡。每次主播開播動作,就能通知到使用者這邊做對應動作,看直播或者做其他事情。與onClick比較,他強大之處,主播的動作也可以自定義,以及可以控制主播和使用者,具體在哪個執行緒中進行。我想這就是Rxjava的強大之一

基本實現:

1.建立 Observe

Observer<String> observer = new Observer<String>() {
  @Override
  public void onNext(String s) {
      Log.d(tag, "Item: " + s);
  }

  @Override
  public void onCompleted() {
      Log.d(tag, "Completed!");
  }

  @Override
  public void onError(Throwable e) {
      Log.d(tag, "Error!");
  }
};
複製程式碼

2.建立 Observable 另外還有 just/from 等建立方法就不一一闡述

Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
  @Override
  public void call(Subscriber<? super String> subscriber) {
      subscriber.onNext("Hello world");
      subscriber.onCompleted();
  }
}); 
複製程式碼

3.Subscribe (訂閱)

observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);
複製程式碼

Subscribe內部原始碼大致是這樣(copy拋物線大神,原始碼實在太雜)

public Subscription subscribe(Subscriber subscriber) {
    subscriber.onStart();
    onSubscribe.call(subscriber);
    return subscriber;
}
複製程式碼

Onstart執行的類似Subscriber 的生命週期的概念,這是一個可選方法,預設情況下它的實現為空。 .call(Subscriber)在這裡,事件傳送的邏輯開始執行。從這也可以看出,在 RxJava 中, Observable 並不是在建立的時候就立即開始傳送事件,而是在它被訂閱的時候,即當 subscribe() 方法執行的時候。

##執行緒控制 —— Scheduler

RxJava 另一個牛逼的地方,就是執行緒的自由控制,多次切換執行緒。 ** observeOn()** ** subscribeOn()** 兩個方法,指定對應的工作在指定的執行緒進行 示例程式碼:

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() 指定
複製程式碼

通過 observeOn() 的多次呼叫,程式實現了執行緒的多次切換,不同於 observeOn() , subscribeOn() 的位置放在哪裡都可以,但它是隻能呼叫一次的,當使用了多個 subscribeOn() 的時候,只有第一個 subscribeOn() 起作用 doOnSubscribe(): 如果在 doOnSubscribe() 之後有 subscribeOn() 的話,它將執行在離它最近的 subscribeOn() 所指定的執行緒。

操作符

RxJava 之所以強大,我覺得還因為他整合了各種API操作符,簡直不要太全。

普通操作符包括:interval、repeat和intervalRange等。 變換操作符:map、flatMap、cast和concatMap等;這幾個已經靈活用到各個應用場景 過濾操作符包括:filter、skip、take、element等等。 組合操作符包括:merge、startWidth、concat、jion、switch和zip等等。 輔助操作符包括:DO、delay、observeOn、timeout、timeInterval、timestamp、subscribeOn、meterialize和to等。 錯誤操作符包括:catch和retry。 條件操作符包括:defaultEmpty、skipUntil、amb、skipWhile、takeUtil、takeWhile。 布林操作符包括:all、isEmpty、contains、exists和sequenceEqual。 轉換操作符包括:toMap、toMultiMap、toList、toSortedList、nest和getIterator等

以上是RxJava的最基礎的用法

下一篇開始談談在框架中RxJava結合Retrofit的使用