RxJava1.X升級到RxJava2.X筆記

描述 RxJava 1.X RxJava 2.X
package包名 rx.xxx io.reactivex.xxx
Reactive Streams規(guī)范 1.X早于Reactive Streams規(guī)范出現(xiàn)池磁,僅部分支持規(guī)范 完全支持
Backpressure 背壓 對背壓的支持不完善 Observable設計為不支持背壓
新增Flowable支持背壓
null空值 支持 不再支持null值,傳入null值會拋出 NullPointerException
Schedulers線程調(diào)度器 Schedulers.immediate()
Schedulers.trampoline()
Schedulers.computation()
Schedulers.newThread()
Schedulers.io()
Schedulers.from(executor)
AndroidSchedulers.mainThread()
移除Schedulers.immediate()
新增Schedulers.single()
其它未變
Single 行為類似Observable湃密,但只會發(fā)射一個onSuccessonError 按照Reactive Streams規(guī)范重新設計型型,遵循協(xié)議onSubscribe(onSuccess/onError)
Completable 行為類似Observable和橙,要么全部成功撬腾,要么就失敗 按照Reactive Streams規(guī)范重新設計椅亚,遵循協(xié)議onSubscribe (onComplete/onError)
Maybe 2.X新增,行為類似Observable,可能會有一個數(shù)據(jù)或一個錯誤想幻,也可能什么都沒有软能。可以將其視為一種返回可空值的方法举畸。這種方法如果不拋出異常的話查排,將總是會返回一些東西,但是返回值可能為空抄沮,也可能不為空跋核。按照Reactive Streams規(guī)范設計,遵循協(xié)議onSubscribe (onSuccess/onError/onComplete)
Flowable 2.X新增叛买,行為類似Observable砂代,按照Reactive Streams規(guī)范設計,支持背壓Backpressure
Subject AsyncSubject
BehaviorSubject
PublishSubject
ReplaySubject
UnicastSubject
2.X依然維護這些Subject現(xiàn)有的功能率挣,并新增:
AsyncProcessor
BehaviorProcessor
PublishProcessor
ReplayProcessor
UnicastProcessor
支持背壓Backpressure
Subscriber Subscriber 由于與Reactive Streams的命名沖突刻伊,Subscriber已重命名為Disposable

RxJava 2.X + Retrofit + OkHttp 簡單示例點這里

library依賴變化

//1.X
compile 'io.reactivex:rxjava:1.2.1'
compile 'io.reactivex:rxandroid:1.2.1'

//2.X
compile 'io.reactivex.rxjava2:rxjava:2.0.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.0'

package變化

變動主要為rx.xxx --> io.reactivex.xxx

//1.X
import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import rx.functions.Action1;

//2.X
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.ObservableTransformer;
import io.reactivex.disposables.Disposable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import io.reactivex.functions.Consumer;

null

RxJava 2.X不再支持null值,如果傳入一個null會拋出NullPointerException

Observable.just(null);

Single.just(null);

Observable.fromCallable(() -> null)
    .subscribe(System.out::println, Throwable::printStackTrace);

Observable.just(1).map(v -> null)
    .subscribe(System.out::println, Throwable::printStackTrace);

案例1

//1.X
public static final Observable.Transformer IO_TRANSFORMER = new Observable.Transformer() {
    @Override public Object call(Object observable) {
        return ((Observable) observable).subscribeOn(Schedulers.io())
                                        .unsubscribeOn(Schedulers.io())
                                        .observeOn(Schedulers.io());
    }
};
public static final <T> Observable.Transformer<T, T> applySchedulers(Observable.Transformer transformer){
    return (Observable.Transformer<T, T>)transformer;
}
Action1<Integer> onNext = null;
String[] items = { "item1", "item2", "item3" };
Subscription subscription = Observable.from(items)
                                      .compose(RxUtil.<String>applySchedulers(IO_TRANSFORMER))
                                      .map(new Func1<String, Integer>() {
                                                  @Override public Integer call(String s) {
                                                      return Integer.valueOf(s);
                                                  }
                                              })
                                      .subscribe(onNext);
//TODO subscription.unsubscribe();   

//2.X
public static final ObservableTransformer IO_TRANSFORMER = new ObservableTransformer() {
    @Override public ObservableSource apply(Observable upstream) {
        return upstream.subscribeOn(Schedulers.io())
                       .unsubscribeOn(Schedulers.io())
                       .observeOn(Schedulers.io());
    }
};
public static final <T> ObservableTransformer<T, T> applySchedulers(ObservableTransformer transformer){
    return (ObservableTransformer<T, T>)transformer;
}
Consumer<Integer> onNext = null;
String[] items = { "item1", "item2", "item3" };
Disposable disposable = Observable.fromArray(items)
                                  .compose(RxUtil.<String>applySchedulers(IO_TRANSFORMER))
                                  .map(new Function<String, Integer>() {
                                              @Override public Integer apply(String s) throws Exception {
                                                  return Integer.valueOf(s);
                                              }
                                          })
                                  .subscribe(onNext);
//TODO disposable.dispose();
  • .subscribe(...)返回值的變化:1.X為Subscription, 2.X為Disposable
  • Transformer的變化:1.X為rx.Observable內(nèi)部的Transformer接口, 繼承自Func1<Observable<T>, Observable<R>>, 2.X為io.reactivexObservableTransformer<Upstream, Downstream>,是一個獨立的接口
  • AndroidSchedulers的變化: 1.X為rx.android.schedulers.AndroidSchedulers, 2.X為io.reactivex.android.schedulers.AndroidSchedulers
  • Func1的變化: 1.X為rx.functions.Func1, 2.X為io.reactivex.functions.Function
  • 其它重載方法見下方截圖


    1.X

    2.X

案例2

//1.X
public class AppBaseActivity extends AppCompatActivity {
    ...
    private CompositeSubscription mCompositeSubscription;
    
    protected void addSubscription(Subscription subscription) {
        if (null == mCompositeSubscription) {
            mCompositeSubscription = new CompositeSubscription();
        }
        mCompositeSubscription.add(subscription);
    }

    @Override protected void onDestroy() {
        if (null != mCompositeSubscription) {
            mCompositeSubscription.unsubscribe();
        }
        super.onDestroy();
    }
    ...
}

//2.X
public class AppBaseActivity extends AppCompatActivity {
    ...
    private   CompositeDisposable mCompositeDisposable;

    protected void addDisposable(Disposable disposable) {
        if (null == mCompositeDisposable) {
            mCompositeDisposable = new CompositeDisposable();
        }
        mCompositeDisposable.add(disposable);
    }

    @Override protected void onDestroy() {
        if (null != mCompositeDisposable) {
            mCompositeDisposable.clear();
        }
        super.onDestroy();
    }
    ...
}

我現(xiàn)在維護的項目基本就這些改動椒功,如有錯誤之處捶箱,還望批評指正,謝謝动漾!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丁屎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旱眯,更是在濱河造成了極大的恐慌晨川,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件删豺,死亡現(xiàn)場離奇詭異共虑,居然都是意外死亡,警方通過查閱死者的電腦和手機呀页,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門妈拌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赔桌,你說我怎么就攤上這事供炎。” “怎么了疾党?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵音诫,是天一觀的道長。 經(jīng)常有香客問我雪位,道長竭钝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮香罐,結(jié)果婚禮上卧波,老公的妹妹穿的比我還像新娘。我一直安慰自己庇茫,他們只是感情好港粱,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旦签,像睡著了一般查坪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宁炫,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天偿曙,我揣著相機與錄音,去河邊找鬼羔巢。 笑死望忆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的竿秆。 我是一名探鬼主播启摄,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袍辞!你這毒婦竟也來了鞋仍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤搅吁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后落午,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谎懦,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年溃斋,在試婚紗的時候發(fā)現(xiàn)自己被綠了界拦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡梗劫,死狀恐怖享甸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梳侨,我是刑警寧澤蛉威,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站走哺,受9級特大地震影響蚯嫌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一择示、第九天 我趴在偏房一處隱蔽的房頂上張望束凑。 院中可真熱鬧,春花似錦栅盲、人聲如沸汪诉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摩瞎。三九已至,卻和暖如春孝常,著一層夾襖步出監(jiān)牢的瞬間旗们,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工构灸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留上渴,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓喜颁,卻偏偏與公主長得像稠氮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子半开,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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

  • 前言我從去年開始使用 RxJava 隔披,到現(xiàn)在一年多了。今年加入了 Flipboard 后寂拆,看到 Flipboard...
    占導zqq閱讀 9,158評論 6 151
  • 我從去年開始使用 RxJava 奢米,到現(xiàn)在一年多了。今年加入了 Flipboard 后纠永,看到 Flipboard 的...
    Jason_andy閱讀 5,456評論 7 62
  • 前言 如果你對RxJava1.x還不是了解鬓长,可以參考下面文章。 1. RxJava使用介紹 【視頻教程】2. Rx...
    jdsjlzx閱讀 21,122評論 3 78
  • 以下都是本人收集和總結(jié)的內(nèi)容: 1. 什么是Rxjava Rx含義 ReactiveX是Reactive Exte...
    WuXiao_閱讀 4,153評論 0 9
  • 今天盧毅早早就回來了尝江,她一放學書包后過來問我涉波,媽媽桌上的蛋糕是你買的我說嗯,你洗洗手在吃炭序,盧毅很乖的就去洗手了啤覆,我...
    盧毅媽媽閱讀 163評論 0 0