RxJava 1與RxJava 2的API上的區(qū)別

RxJava 2相比于RxJava 1首繁,改動(dòng)還是比較大的作郭,這里我們來簡(jiǎn)單說一下API上的改變

1.Flowable

RxJava1 中 Observable 不能很好地支持 backpressure ,最常見的例如UI事件弦疮,而不處理backpressure有可能導(dǎo)致MissingBackpressureException的出現(xiàn)夹攒。所以在 RxJava2 中 Oberservable 不再支持 backpressure ,而使用新增的 Flowable 來支持 backpressure 胁塞。
Flowable的用法跟原先的Observable是一樣的咏尝。

2.ActionN 和 FuncN 改名

ActionN 和 FuncN 遵循Java 8的命名規(guī)則。
其中啸罢,Action0 改名成Action编检,Action1改名成Consumer,而Action2改名成了BiConsumer扰才,而Action3 - Action9都不再使用了允懂,ActionN變成了Consumer<Object[]> 。

同樣衩匣,F(xiàn)unc改名成Function蕾总,F(xiàn)unc2改名成BiFunction粥航,F(xiàn)unc3 - Func9 改名成 Function3 - Function9,F(xiàn)uncN 由 Function<Object[], R> 取代生百。

3.Observable.OnSubscribe 變成 ObservableOnSubscribe

RxJava1的寫法:

Observable.create(new Observable.OnSubscribe<String>() {
 
 @Override
 public void call(Subscriber<? super String> subscriber) {
  subscriber.onNext("hello");
 }
 
}).subscribe(new Action1<String>() {
 
 @Override
 public void call(String s) {
  System.out.println(s);
 }
});

RxJava2的寫法:

Observable.create(new ObservableOnSubscribe<String>() {
 
 @Override
 public void subscribe(ObservableEmitter<String> e) throws Exception {
  e.onNext("hello");
 }
 
}).subscribe(new Consumer<String>() {
 
 @Override
 public void accept(String s) {
  System.out.println(s);
 }
});

4. ObservableOnSubscribe 中使用 ObservableEmitter 發(fā)送數(shù)據(jù)給 Observer

結(jié)合上一條递雀,ObservableOnSubscribe 不再使用 Subscriber 而是用 ObservableEmitter 替代。

ObservableEmitter 可以理解為發(fā)射器蚀浆,是用來發(fā)出事件的缀程,它可以發(fā)出三種類型的事件,通過調(diào)用emitter的onNext(T value) 市俊、onComplete()和onError(Throwable error)可以分別發(fā)出next事件杠输、complete事件和error事件。 如果只關(guān)心next事件的話秕衙,只需單獨(dú)使用onNext()即可蠢甲。

需要特別注意,emitter的onComplete()調(diào)用后据忘,Consumer不再接收任何next事件鹦牛。

5. Observable.Transformer 變成 ObservableTransformer

RxJava1的寫法:

/**
 * 跟compose()配合使用,比如ObservableUtils.wrap(obj).compose(toMain())
 * @param <T>
 * @return
 */
public static <T> Observable.Transformer<T, T> toMain() {
 return new Observable.Transformer<T, T>() {
  @Override
  public Observable<T> call(Observable<T> tObservable) {
   return tObservable
     .subscribeOn(Schedulers.io())
     .observeOn(AndroidSchedulers.mainThread());
  }
 };
}

RxJava2的寫法:

/**
 * 跟compose()配合使用,比如ObservableUtils.wrap(obj).compose(toMain())
 * @param <T>
 * @return
 */
public static <T> ObservableTransformer<T, T> toMain() {
 
 return new ObservableTransformer<T, T>() {
 
  @Override
  public ObservableSource<T> apply(Observable<T> upstream) {
   return upstream.subscribeOn(Schedulers.io())
     .observeOn(AndroidSchedulers.mainThread());
  }
 };
}

由于新增了Flowable,同理也增加了FlowableTransformer

public static <T> FlowableTransformer<T, T> toMain() {
 
 return new FlowableTransformer<T, T>() {
 
  @Override
  public Publisher<T> apply(Flowable<T> upstream) {
   return upstream.subscribeOn(Schedulers.io())
     .observeOn(AndroidSchedulers.mainThread());
  }
 };
}

6.Subscription 改名為 Disposable

在 RxJava2 中勇吊,由于已經(jīng)存在了 org.reactivestreams.subscription 這個(gè)類曼追,為了避免名字沖突將原先的 rx.Subscription 改名為 io.reactivex.disposables.Disposable 。

剛開始不知道汉规,在升級(jí) RxJava2 時(shí)發(fā)現(xiàn) org.reactivestreams.subscription 這個(gè)類完全沒法做原先 rx.Subscription 的事情:(

順便說下礼殊,Disposable必須單次使用,用完就要銷毀针史。

7. first() 用法改變

官方文檔是這么描述的first()的用法

1.x 2.x
first() RC3 renamed to firstElement and returns Maybe<T>
first(Func1) dropped, use filter(predicate).first()
firstOrDefault(T) renamed to first(T) and RC3 returns Single<T>
firstOrDefault(Func1, T) renamed to first(T) and RC3 returns Single<T>

first(Func1)為例晶伦,first(Func1)后面還使用了push() ,原先 Rxjava1會(huì)這樣寫

ConnectableObservable<Data> connectableObservable = Observable
   .concat(Observable.from(list))
   .first(new Func1<Data, Boolean>() {
    @Override
    public Boolean call(Data data) {
     return DataUtils.isAvailable(data);
    }
   }).publish();

RxJava2 改成這樣

ConnectableObservable<Data> connectableObservable = Observable
   .concat(Observable.fromIterable(list))
   .filter(new Predicate<Data>() {
 
    @Override
    public boolean test(@NonNull Data data) throws Exception {
     return DataUtils.isAvailable(data);
    }
   }).firstElement().toObservable().publish();

8. toBlocking().y 被 blockingY() 取代

在我的框架中存在著一個(gè)Optional類啄枕,它跟Java 8的Optional作用差不多婚陪,原先是使用RxJava1來編寫的。

import rx.Observable;
 
/**
 * 使用方法:
 *   String s = null;
 *   Optional.ofNullable(s).orElse("default")); // 如果s為null,則顯示default,否則顯示s的值
 * @author Tony Shen
 *
 */
public class Optional<T> {
 
 Observable<T> obs;
 
 public Optional(Observable<T> obs) {
  this.obs = obs;
 }
 
 public static <T> Optional<T> of(T value) {
  if (value == null) {
   throw new NullPointerException();
  } else {
   return new Optional<T>(Observable.just(value));
  }
 }
 
 public static <T> Optional<T> ofNullable(T value) {
  if (value == null) {
   return new Optional<T>(Observable.<T>empty());
  } else {
   return new Optional<T>(Observable.just(value));
  }
 }
 
 public T get() {
  return obs.toBlocking().single();
 }
 
 public T orElse(T defaultValue) {
  return obs.defaultIfEmpty(defaultValue).toBlocking().single();
 }
}

升級(jí)到RxJava2之后频祝,get()orElse()方法都會(huì)報(bào)錯(cuò)泌参,修改之后是這樣的。

import io.reactivex.Observable;
 
/**
 * 使用方法:
 *   String s = null;
 *   Optional.ofNullable(s).orElse("default"); // 如果s為null,則顯示default,否則顯示s的值
 * @author Tony Shen
 *
 */
public class Optional<T> {
 
 Observable<T> obs;
 
 public Optional(Observable<T> obs) {
  this.obs = obs;
 }
 
 public static <T> Optional<T> of(T value) {
  if (value == null) {
   throw new NullPointerException();
  } else {
   return new Optional<T>(Observable.just(value));
  }
 }
 
 public static <T> Optional<T> ofNullable(T value) {
  if (value == null) {
   return new Optional<T>(Observable.<T>empty());
  } else {
   return new Optional<T>(Observable.just(value));
  }
 }
 
 public T get() {
 
  return obs.blockingSingle();
 }
 
 public T orElse(T defaultValue) {
 
  return obs.defaultIfEmpty(defaultValue).blockingSingle();
 }
}

9. PublishSubject

包括 PublishSubject 以及各種 Subject(ReplaySubject常空、BehaviorSubject沽一、AsyncSubject) 都不再支持backpressure。

總結(jié)

RxJava2 所帶來的變化遠(yuǎn)遠(yuǎn)不止這些漓糙,以后遇到的話還會(huì)繼續(xù)整理和總結(jié)铣缠,畢竟我使用的 RxJava2 還是很少的一部分內(nèi)容。

RxJava2 最好到文檔依然是官方文檔。如果是新項(xiàng)目到話攘残,可以毫不猶豫地使用RxJava2拙友,如果是在線上已經(jīng)成熟穩(wěn)定的項(xiàng)目为狸,可以再等等歼郭。對(duì)于新手的話,可以直接從 RxJava2 學(xué)起辐棒,RxJava1 就直接略過吧病曾。對(duì)于老手,RxJava2 還是使用原來的思想漾根,區(qū)別不大泰涂,從 RxJava1 遷移到 Rxjava2 也花不了多少工夫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辐怕,一起剝皮案震驚了整個(gè)濱河市逼蒙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寄疏,老刑警劉巖是牢,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異陕截,居然都是意外死亡驳棱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門农曲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來社搅,“玉大人,你說我怎么就攤上這事乳规⌒卧幔” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵暮的,是天一觀的道長(zhǎng)荷并。 經(jīng)常有香客問我,道長(zhǎng)青扔,這世上最難降的妖魔是什么源织? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮微猖,結(jié)果婚禮上谈息,老公的妹妹穿的比我還像新娘。我一直安慰自己凛剥,他們只是感情好侠仇,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般逻炊。 火紅的嫁衣襯著肌膚如雪互亮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天余素,我揣著相機(jī)與錄音豹休,去河邊找鬼。 笑死桨吊,一個(gè)胖子當(dāng)著我的面吹牛威根,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播视乐,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼洛搀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了佑淀?” 一聲冷哼從身側(cè)響起留美,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伸刃,沒想到半個(gè)月后谎砾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奕枝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年棺榔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隘道。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡症歇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谭梗,到底是詐尸還是另有隱情忘晤,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布激捏,位于F島的核電站设塔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏远舅。R本人自食惡果不足惜闰蛔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望图柏。 院中可真熱鬧序六,春花似錦、人聲如沸蚤吹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至繁涂,卻和暖如春拱她,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扔罪。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工秉沼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人步势。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓氧猬,卻偏偏與公主長(zhǎng)得像背犯,于是被迫代替她去往敵國(guó)和親坏瘩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 前言 如果你對(duì)RxJava1.x還不是了解漠魏,可以參考下面文章倔矾。 1. RxJava使用介紹 【視頻教程】2. Rx...
    jdsjlzx閱讀 21,141評(píng)論 3 78
  • RxJava2 RxJava2 發(fā)布已經(jīng)有一段時(shí)間了,是對(duì) RxJava 的一次重大的升級(jí)柱锹,由于我的一個(gè)庫(kù)cv4j...
    fengzhizi715閱讀 25,462評(píng)論 12 72
  • RxJava RxJava是響應(yīng)式程序設(shè)計(jì)的一種實(shí)現(xiàn)哪自。在響應(yīng)式程序設(shè)計(jì)中,當(dāng)數(shù)據(jù)到達(dá)的時(shí)候禁熏,消費(fèi)者做出響應(yīng)壤巷。響應(yīng)式...
    Mr槑閱讀 936評(píng)論 0 5
  • 怎么如此平靜, 感覺像是走錯(cuò)了片場(chǎng).為什么呢, 因?yàn)樯舷掠喂ぷ髟谕粋€(gè)線程呀騷年們! 這個(gè)時(shí)候上游每次調(diào)用emit...
    Young1657閱讀 1,455評(píng)論 2 1
  • 前言 之前寫RxJava相關(guān)文章的時(shí)候,就有人想讓我談?wù)凴xJava2.0的新特性瞧毙,說實(shí)話胧华,一開始我是拒絕的。因?yàn)?..
    拉丁吳閱讀 19,688評(píng)論 12 108