最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RxJava 1升級(jí)到RxJava 2過程中踩過的一些“坑”

 更新時(shí)間:2017年05月26日 10:44:22   作者:fengzhizi715  
RxJava2相比RxJava1,它的改動(dòng)還是很大的,那么下面這篇文章主要給大家總結(jié)了在RxJava 1升級(jí)到RxJava 2過程中踩過的一些“坑”,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下來要一起看看吧。

RxJava2介紹

RxJava2 發(fā)布已經(jīng)有一段時(shí)間了,是對(duì) RxJava 的一次重大的升級(jí),由于我的一個(gè)庫cv4j使用了 RxJava2 來嘗鮮,但是 RxJava2 跟 RxJava1 是不能同時(shí)存在于一個(gè)項(xiàng)目中的,逼不得已我得把自己所有框架中使用 RxJava 的地方以及
App 中使用 RxJava 的地方都升級(jí)到最新版本。所以我整理并記錄了一些已經(jīng)填好的坑。分享出來供大家參考學(xué)習(xí),下面來看看詳細(xì)的介紹:

填坑記錄

1. RxJava1 跟 RxJava2 不能共存

如果,在同一個(gè)module中同時(shí)使用RxJava1和RxJava2,類似如下:

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.7'
compile 'io.reactivex:rxandroid:1.2.0'
compile 'io.reactivex:rxjava:1.1.5'

那么,很不幸你會(huì)遇到這樣的錯(cuò)誤


同理,在 App 中如果使用了 Rxjava2,但是某個(gè)第三方的 library 還在使用 Rxjava1 也會(huì)遇到同樣的錯(cuò)誤。

上面的錯(cuò)誤是因?yàn)?RxAndroid 2.0.1 本身依賴了 RxJava 2.0.1。我們嘗試去掉對(duì) RxJava 的依賴,只留下 RxAndroid 。還是會(huì)遇到問題。

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
//compile 'io.reactivex.rxjava2:rxjava:2.0.7'
compile 'io.reactivex:rxandroid:1.2.0'
//compile 'io.reactivex:rxjava:1.1.5'

所以使用RxAndroid不能去掉對(duì)RxJava的依賴,我是這樣使用的。

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.7'

官方也是這樣解釋的

Because RxAndroid releases are few and far between, it is recommended you also
explicitly depend on RxJava's latest version for bug fixes and new features.

最后,我建議要升級(jí)到 RxJava2 的時(shí)候必須所有使用的地方都要升級(jí),并且用最新的版本。

2. 新增Flowable

RxJava1 中 Observable 不能很好地支持 backpressure ,會(huì)拋出MissingBackpressureException。所以在 RxJava2 中 Oberservable 不再支持 backpressure ,而使用新增的 Flowable 來支持 backpressure 。

Flowable的用法跟原先的Observable是一樣的。

3. 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> 取代。

4. 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);
   }
  });

現(xiàn)在的寫法:

  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);
   }
  });

5. 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事件。

6. 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());
   }
  };
 }

現(xiàn)在的寫法:

 /**
  * 跟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());
   }
  };
 }

7. 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必須單次使用,用完就要銷毀。

8. 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();

9. 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();
 }
}

10. 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 也花不了多少工夫。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Android自定義View仿騰訊TIM下拉刷新View

    Android自定義View仿騰訊TIM下拉刷新View

    這篇文章主要給大家介紹了關(guān)于Android自定義View仿騰訊TIM下拉刷新View的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • 淺析Android文件存儲(chǔ)

    淺析Android文件存儲(chǔ)

    本文詳細(xì)介紹了android的外部存儲(chǔ)和私有存儲(chǔ)。大家在有保存文件的需求的時(shí)候,根據(jù)自己的需要,選擇到底是存在哪里比較合適。內(nèi)部存儲(chǔ)相對(duì)較小,不介意把一些大文件存在其中。應(yīng)該存在外部存儲(chǔ)會(huì)更好。對(duì)于可以給其他文件訪問的,可以存在外部存儲(chǔ)的公有文件里面
    2021-06-06
  • Android 應(yīng)用啟動(dòng)歡迎界面廣告的實(shí)現(xiàn)實(shí)例

    Android 應(yīng)用啟動(dòng)歡迎界面廣告的實(shí)現(xiàn)實(shí)例

    這篇文章主要介紹了Android 應(yīng)用啟動(dòng)歡迎界面廣告的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • VS Code開發(fā)React-Native及Flutter 開啟無線局域網(wǎng)安卓真機(jī)調(diào)試問題

    VS Code開發(fā)React-Native及Flutter 開啟無線局域網(wǎng)安卓真機(jī)調(diào)試問題

    這篇文章主要介紹了VS Code開發(fā)React-Native,F(xiàn)lutter 開啟無線局域網(wǎng)安卓真機(jī)調(diào)試,需要的朋友可以參考下
    2020-04-04
  • 詳解Android 視頻滾動(dòng)列表(偷懶型)

    詳解Android 視頻滾動(dòng)列表(偷懶型)

    小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧本篇文章主要介紹了Android 視頻滾動(dòng)列表(偷懶型),
    2017-11-11
  • OpenGL ES正交投影實(shí)現(xiàn)方法(三)

    OpenGL ES正交投影實(shí)現(xiàn)方法(三)

    這篇文章主要為大家詳細(xì)介紹了OpenGL ES正交投影的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android 模擬器(emulator-5554...)出現(xiàn)錯(cuò)誤解決辦法

    Android 模擬器(emulator-5554...)出現(xiàn)錯(cuò)誤解決辦法

    這篇文章主要介紹了Android 模擬器出現(xiàn)錯(cuò)誤解決辦法的相關(guān)資料,如:Unable to get view server version from device,F(xiàn)ailed to install helloworld.apk on device 'emulator-5554': timeout,這種常見錯(cuò)誤,解決辦法,需要的朋友可以參考下
    2016-11-11
  • Android開發(fā)實(shí)現(xiàn)從相冊(cè)中選擇照片功能詳解

    Android開發(fā)實(shí)現(xiàn)從相冊(cè)中選擇照片功能詳解

    這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)從相冊(cè)中選擇照片功能,涉及Android權(quán)限控制、事件綁定、文件路徑與獲取等相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • kotlin中泛型中in和out的區(qū)別解析

    kotlin中泛型中in和out的區(qū)別解析

    在Kotlin泛型中,in關(guān)鍵字主要用于定義逆變(Contravariance),它表示一個(gè)泛型類型參數(shù)可以是指定類型或者它的超類型,這篇文章主要介紹了kotlin中泛型中in和out的區(qū)別解析,需要的朋友可以參考下
    2024-12-12
  • Android實(shí)現(xiàn)圓角圖片

    Android實(shí)現(xiàn)圓角圖片

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圓角圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01

最新評(píng)論

习水县| 永善县| 城固县| 阳江市| 上思县| 宜黄县| 安乡县| 翼城县| 古蔺县| 惠来县| 清水河县| 南投县| 大新县| 本溪| 东阳市| 长寿区| 甘谷县| 加查县| 沙湾县| 佛学| 永济市| 宣化县| 礼泉县| 尼玛县| 巫山县| 得荣县| 吉安县| 鄂尔多斯市| 岑巩县| 伽师县| 遵义县| 沛县| 堆龙德庆县| 海口市| 泰顺县| 绥阳县| 额尔古纳市| 临潭县| 准格尔旗| 沐川县| 山丹县|