Table of Contents
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 のサンプル (ポーリング)
GitHub - ka-yamao/example at 2763
Contribute to ka-yamao/example development by creating an account on GitHub.
参考サイト
明日から使えるRxjava頻出パターン (Droid kaigi 2016)
RxJavaに3日で入門し、Androidアプリのリスト操作、非同期処理、変更通知の課題を解決した話
【Reactive Extensions】 Hot変換はどういう時に必要なのか?
RxJava2.0 Observable, Single, Maybe, Completableの使い分けメモ
詳解RxJava2:Backpressureで流速制御 - Qiita
7つのサンプルプログラムで学ぶRxJavaの挙動 - クックパッド開発者ブログ
Android開発でRxJavaをチームに導入した話 - クックパッド開発者ブログ
RxJavaに3日で入門し、Androidアプリのリスト操作、非同期処理、変更通知の課題を解決した話 - Qiita