欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

RxJava1升級(jí)到RxJava2過(guò)程中踩過(guò)的一些“坑”

RxJava2介紹

在友誼等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站制作,友誼網(wǎng)站建設(shè)費(fèi)用合理。

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

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

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

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

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'

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

所以使用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 來(lái)支持 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ā)射器,是用來(lái)發(fā)出事件的,它可以發(fā)出三種類型的事件,通過(guò)調(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

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

順便說(shuō)下,Disposable必須單次使用,用完就要銷毀。

8. first() 用法改變

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

1.x2.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來(lái)編寫的。

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 所帶來(lái)的變化遠(yuǎn)遠(yuǎn)不止這些,以后遇到的話還會(huì)繼續(xù)整理和總結(jié),畢竟我使用的 RxJava2 還是很少的一部分內(nèi)容。

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

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。

新聞名稱:RxJava1升級(jí)到RxJava2過(guò)程中踩過(guò)的一些“坑”
網(wǎng)站鏈接:http://chinadenli.net/article0/joisio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、用戶體驗(yàn)、軟件開(kāi)發(fā)服務(wù)器托管、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
亚洲第一区欧美日韩在线| 亚洲综合色在线视频香蕉视频| 欧美日韩国产精品自在自线| 久久国产精品亚州精品毛片| 中文字幕熟女人妻视频| 免费亚洲黄色在线观看| 日本成人三级在线播放| 国产精品一区二区三区黄色片| 成人精品欧美一级乱黄| 欧美日韩一级aa大片| 免费观看在线午夜视频| 玩弄人妻少妇一区二区桃花 | 青青免费操手机在线视频| 91偷拍与自偷拍精品| 亚洲一二三四区免费视频| 日韩人妻一区中文字幕| 国产毛片对白精品看片| 亚洲中文字幕在线乱码av| 日本乱论一区二区三区| 国产白丝粉嫩av在线免费观看| 精品少妇一区二区视频| 日本淫片一区二区三区| 国产一区二区三区av在线| 国产一区二区三区av在线| 日本精品啪啪一区二区三区| 中日韩免费一区二区三区| 午夜精品福利视频观看| 正在播放国产又粗又长| 在线免费不卡亚洲国产| 成人日韩在线播放视频| 老外那个很粗大做起来很爽| 夜夜躁狠狠躁日日躁视频黑人| 99国产成人免费一区二区| 日韩一区二区三区四区乱码视频| 人妻露脸一区二区三区| 欧美成人国产精品高清| 老外那个很粗大做起来很爽| 亚洲国产中文字幕在线观看| 97人妻精品一区二区三区男同| 日本黄色高清视频久久| 色丁香之五月婷婷开心|