Exploring RxJava 2 for Android

Video source: Exploring RxJava 2 for Android ·Jake Wharton

RxJava provide:

  • A set of classes for representing sources of data.
  • A set of classes for listening to data sources.
  • A set of methods for modifying and composing the data.

Sources

  • Observable<T>

    • Emits 0 to n items
    • Terminates with complete or error
    • Does not have backpressure
  • Flowable<T>

    • Emits 0 to n items
    • Terminates with complete or error
    • Has backpressure
  • Flowable vs. Observable

    • Backpressure allows you to control how fast (slow them down) a source emits items.
    • RxJava 1.x added backpressure late in the design process.
    • All types exposed backpressure but not all sources respected it.
    • Backpressure likes inheritance, must be designed for.
Observable<MotionEvent> events = RxView.touches(paintView);

Flowable<Row> rows = db.createQuery("SELECT * ...").
observablevsflowable.png
  • Single

    • Either succeeds with an item or errors.
    • No backpressure support
    • Think "reactive scalar"
  • Completable

    • Either completes or errors. Has no items!
    • No backpressure support
    • Think "reactive runnable"
  • Maybe

    • Either succeeds with an item, completes with no items, or errors.
    • No backpressure support
    • Think "reactive optional"

Consumers

interface Publisher<T> {
  void subscribe(Subscriber<? super T> s);
}
interface Subscriber<T> {
  void onNext(T t);
  void onComplete();
  void onError();
  void onSubscriber(Subscription s);
}
interface Subscription {
  void request(long n);
  void cancel();
}
interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}

Creating Sources

Observable.fromCallable(new Callable<String>() {
  @Override public String call() throws Exception {
    return getName();
  }
});

Flowable.fromCallable(() -> "Hello");

Maybe.fromCallable(() -> "Hello");
Maybe.fromAction(() -> System.out.println("Hello"));
Maybe.fromRunnable(() -> System.out.println("Hello"));

Single.fromCallable(() -> "Hello");

Completable.fromCallable(() -> "Hello");
Completable.fromAction(() -> System.out.println("Hello"));
Completable.fromRunnable(() -> System.out.println("Hello"));
  • RxJava 2 has a fixed Observable.create() method:
Observable.create(new ObservableOnSubscribe<String>() {
  @Override
  public void subscribe(ObservableEmitter<String> e) throws Exception {
    e.onNext("Hello");
    e.onComplete();
  }
});

Observing Sources

Observable<String> o = Observable.just("Hello");

o.subscribe(new Observer<String>() {
  @Override public void onNext(String s) {...}
  @Override public void onComplete() {...}
  @Override public void onError(Throwable t) {...}
  @Override public void onSubscribe(Disposable d) {
    ...
  }
});

// DisposableObserver help to handle unsubscribe logic
DisposableObserver observer = new DisposableObserver<String>() {
  @Override public void onNext(String s) {...}
  @Override public void onComplete() {...}
  @Override public void onError(Throwable t) {...}
}
o.subscribe(observer);
observer.dispose();

// RxJava2 provide new subscribeWith() method, return a Disposable object, like RxJava1 Subscription object.
Disposable d = o.subscribeWith(new DisposableObserver<String>() {
  @Override public void onNext(String s) {...}
  @Override public void onComplete() {...}
  @Override public void onError(Throwable t) {...}
});
d.dispose();

// RxJava2 also provide CompositeDisposable to handle composite disposable.
CompositeDisposable disposables = new CompositeDisposable();
disposables.add(o.subscribeWith(new DisposableObserver<String>() {
  @Override public void onNext(String s) {...}
  @Override public void onComplete() {...}
  @Override public void onError(Throwable t) {...}
}));
disposables.dispose();

Operators

  • Manipulate or combine data in some way.
  • Manipulate threading in some way.
  • Manipulate emissions in some way.

first()

In RxJava1, Observable object use first() return an Observable object.

rxjava1-first.PNG

In RxJava2, those return a Single object, if the Observable is empty, it will throw NoSuchElementException, because a Single either has an item, or errors.

rxjava2-first.PNG

firstElement()

In RxJava2, When the Observable is empty, Maybe can actually model that by completing without an error.

rxjava2-firstelement.PNG

ignoreElements()

If you are just ignoring the elements, all you care about is whether it completes or fails,that now returns Completable.

ignorelements.PNG

Others

operators.PNG
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末押赊,一起剝皮案震驚了整個濱河市耀销,隨后出現(xiàn)的幾起案子梳虽,更是在濱河造成了極大的恐慌族壳,老刑警劉巖寒随,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狈蚤,居然都是意外死亡欲主,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門草讶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炉菲,你說我怎么就攤上這事堕战。” “怎么了拍霜?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵嘱丢,是天一觀的道長。 經(jīng)常有香客問我祠饺,道長越驻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任道偷,我火速辦了婚禮缀旁,結果婚禮上,老公的妹妹穿的比我還像新娘勺鸦。我一直安慰自己并巍,他們只是感情好,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布换途。 她就那樣靜靜地躺著懊渡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪军拟。 梳的紋絲不亂的頭發(fā)上剃执,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音懈息,去河邊找鬼肾档。 笑死,一個胖子當著我的面吹牛辫继,可吹牛的內容都是我干的阁最。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼骇两,長吁一口氣:“原來是場噩夢啊……” “哼速种!你這毒婦竟也來了?” 一聲冷哼從身側響起低千,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤配阵,失蹤者是張志新(化名)和其女友劉穎馏颂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棋傍,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡救拉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘫拣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亿絮。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖麸拄,靈堂內的尸體忽然破棺而出派昧,到底是詐尸還是另有隱情,我是刑警寧澤拢切,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布蒂萎,位于F島的核電站,受9級特大地震影響淮椰,放射性物質發(fā)生泄漏五慈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一主穗、第九天 我趴在偏房一處隱蔽的房頂上張望泻拦。 院中可真熱鬧,春花似錦忽媒、人聲如沸聪轿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陆错。三九已至,卻和暖如春金赦,著一層夾襖步出監(jiān)牢的瞬間音瓷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工夹抗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绳慎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓漠烧,卻偏偏與公主長得像杏愤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子已脓,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內容

  • 廈門vs武夷山全程550公里度液,因為這里有最牛驢友沒有之一(徐霞客)徒步留下的足跡厕宗。途經(jīng)同安画舌、安溪、赤水已慢、大田曲聂、永安...
    a路一直都在閱讀 268評論 0 1
  • 【蔚瀾】 —— 說好的十年 而今到期 —— 莫羽青在他和蔚瀾初初遇見的地方徘徊了近三個小時朋腋,猜測自己會想很多,然而...
    一遇遇閱讀 671評論 0 1
  • 原來你的熱情不只針對我膜楷,你可以對我如此熱情旭咽,你對別人也是這樣的。 多年后把将,我突然明白了轻专,我可以對你忠心忆矛,也可以對別...
    黑晗真的是理科生閱讀 415評論 1 1