RxJava(RxJava2)をはじめた

RxJavaのイメージ

  • RxJsは聞いたことある
  • Observableも聞いたことある
  • 非同期処理がいい感じにかけそう
  • ストリームもきいたことあるけど(流れ、小川)

このくらいの知識から、とりあえず使ってみた。

RxJavaの基本クラス

  • Observable, Flowable, Single, Maybe, Completable
  • といったものがあるけど、とりあえずObservableを抑えておけばいい
  • 他は、小慣れてきて使ったらよい

Observableからはitemが 同期的 or 非同期 で流れてくる(ストリーム)

  • Observable.fromIterable(List)[v1:Observable.from(List)]を使うと、Listの中身が1つずつ流れてくるObservableを作れる
  • map()やfilter()を始めとするOperatorを使うとストリームに流れてくるitemを加工できる
  • subscribe()で処理を開始(またはobserve開始)し、コールバックに順次itemが流れてくる
  • itemの到着を知らせるonNext()、ストリームの終了を伝えるonComplete()、エラー発生による終了を伝えるonError()がある
  • 同期的に結果を得たい場合は、blockingGet()[v1:toBlocking()]を使用する
  • observeOn()にSchedulerを指定すると、subscribe()のコールバックを指定したスレッド(メインスレッドなど)で呼び出すことができる
  • キャンセルしたい場合はunsubscribe()する(と、適切に実装されたObservableではActivity/Fragmentがリークしない)

まずはリストの操作の概要

  • Cookpadは、リスト操作からRxJavaを導入したそう。既存のfor文をObservableで書き直してプルリクを送信することから始めたそう。

リスト操作の例

こんなリストがあったとする。今からusersリストからselfUserを見つけてリストで取得する

List<User> users = new ArrayList<User>();
users.add(new User(1, "foo"));
users.add(new User(2, "bar"));
users.add(new User(3, "baz"));
User selfUser = new User(2, "bar");

 

Java7

// Java 7
List<String> otherUserNames = new ArrayList<>();
for (User user : users) {
    if (user.id != selfUser.id) {
        otherUserNames.add(user.getName());
    }
}

 

Java8

// Java 8
List<String> otherUserNames = users.stream()
    .filter(user -> user.id != selfUser.id)
    .map(User::getName) // user -> user.getName() の短縮形、method referencesといいます
    .collect(Collectors.toList());

 

RxJava (v1)

// RxJava
List<String> otherUserNames = Observable.from(users)
    .filter(user -> user.id != selfUser.id)
    .map(User::getName)
    .toList().toBlocking().single(); // 全部Listにまとめ、同期処理するよう指定し、1つしかない結果(List)を取り出す

 

RxJava2

// RxJava2
List<String> otherUserNames = Observable.fromIterable(users)
    .filter(user -> user.id != selfUser.id)
    .map(User::getName)
    .toList().blockingGet(); // 全部Listにまとめ、同期処理するよう指定し、1つしかない結果(List)を取り出す

 

非同期処理がとてもわかりやすいスライド

仕事でポーリングをする実装があり、Rxjavaでポーリングの実装をしてみた

  • RxJava のサンプル (ポーリング)

https://github.com/ka-yamao/example/tree/2763

 
 
 
 
 


参考サイト

明日から使えるRxjava頻出パターン (Droid kaigi 2016)

RxJavaに3日で入門し、Androidアプリのリスト操作、非同期処理、変更通知の課題を解決した話

RxのHotとColdについて

【Reactive Extensions】 Hot変換はどういう時に必要なのか?

詳解RxJava2:Backpressureで流速制御

RxJava2.0 Observable, Single, Maybe, Completableの使い分けメモ

詳解RxJava2:Backpressureで流速制御 – Qiita

7つのサンプルプログラムで学ぶRxJavaの挙動 – クックパッド開発者ブログ

Android開発でRxJavaをチームに導入した話 – クックパッド開発者ブログ

RxJavaに3日で入門し、Androidアプリのリスト操作、非同期処理、変更通知の課題を解決した話 – Qiita

Rxで知っておくと便利なSubjectたち – Qiita

やさしくわかる「Kubernetes基礎」 – 感じたままのイノベな日々

RxJavaにで入門し、Androidアプリのリスト操作、非同期処理、変更通知の課題を解決した話 – Qiita