Help us understand the problem. What is going on with this article?

RxJava最初の最初

この記事はRxJavaの深い内容ではなく、初めて触れる際にそもそも、言葉がよくわからない、意味不明な人の最初のステップを対象としています。

自分が初めて勉強した時に、ひたすら調べてまとめた感じなのでこれを読んで雰囲気でも感じとってもらえれば幸いです。

RxJavaとは

非同期なイベントベースのプログラムを合成するライブラリ

最初はなんじゃこりゃって感じなので流して最後に読んだら
少しあーってなります
・Observableからはitemが同期的or非同期に流れてくる(ストリームと言う)
・Observable.from(List)を使うと、Listの中身が1つずつ流れてくるObservableを作れる
・map()やfilter()などのOperatorを使うとストリームに流れてくるitemの加工ができる
・原則subscribe()observeで処理を開始し、コールバックに順次itemが流れてくる
・itemの到着を知らせるonNext()、ストリームの終了を伝えるonComplete()、エラーによる終了を伝えるonError()がある
observeOn()にSchedulerを指定すると、subscribe()のコールバックを指定したスレッドで呼び出すことができる

登場人物

  • Observable(設計図)
  • Scheduler(スレッドの指定)
  • オペレータ(加工したり変更)
  • subscribe(実行)

Observable

とは?

Future(Promise) 、まだ完了していない状態、将来の設計図など言われる。
Future同士をつなぎ合わせてパイプライン化することができる。
未来に起きることを順番に繋げられうこと

一言でまとめると
設計図

よく出てくる言葉

Event:ユーザーが操作した時などに発火するイベント
Async:非同期処理が完了したら発火するイベント
Array:各要素の間隔が限りなく0に近いイベント

itme(Javaのインスタンスなど)をemit(排出)する

onNext
データのある限り、データが正常に送られた時に呼ばれる
subscribeの第一引数に相当
onError
例外の時に呼ばれる
subscribeの第二引数に相当
onComplete
onNextでデータが運ばれてくるが、これ以上送るデータがない時に呼ばれる
最後に呼ばれる
subscribeの第三引数に相当

Observableの種類

使い分けを行うことで、使う側のObserver(Subscriber)で考えることを減らせる
これは型である。

  • Observable(基本形)
  • Single
  • Maybe
  • Completable
  • Flowable

Single

emitterのonSuccessかonErrorを呼ぶと1回だけObserverのonSuccessかonErrorが呼ばれる。
onComplete、onNextメソッドはない
doOnSuccessと言う専用のオペレータがある
考えるパターン
エラー、何もemitも完了しない場合、一個emitされて完了した場合
使い所
値を流すかエラーかのどちらかの場合
RetrofitでAPIからGETしてくる時など

Maybe

onSuccessかonCompleteかonErrorのどれか1つが1回だけ呼ばれる。

Completable

onCompleteかonErrorのどちらかが1回だけ呼ばれる。

Flowable

参考

ここに詳しく書いています。
https://qiita.com/takahirom/items/f3e576e91b219c7239e7

Scheduler

処理を実行するスレッドを指定する。
Observableがデータを生産する処理が行われるスレッド
処理した結果を購読者が受け取る(または加工する)スレッド

Observableがデータを生産する処理(subscribe()で実行される)が行われるスレッドの指定
つまりAPI通信をするスレッド

.subscriveOn(Schedulers.io())

Observableが吐き出したデータを受け取って加工する場所を指定するスレッド結果の通知(UIスレッドで行う)、呼び出した以降のストリームを別のスレッドで実行
Viewの更新をMainThreadでしか呼べないので非同期のリクエストなどを叩いた際はsubscribe()の直前で必ず呼び出す必要あり。

.observeOn(AndroidShedulers.mainThread())

よく使われるスケージューラー一覧

Scheduler 用途
Schedulers.io() 非同期なブロッキングI/Oに向いたスケジューラ。内部的にはスレッドプールが作られワーカを再利用する。ネットワーク通信等に使われることが多いが、必要に応じてスレッドプールを大きくしていくのでOutOfMemoryErrorに注意する。
Schedulers.computation() CPUをガンガン使う計算に向いたスケジューラ。ブロックするI/O処理に向かない。ワーカ数は固定(デフォルトで Runtime#availableProcessors() と同数)なので枯渇するとブロックする点に注意。
Schedulers.newThread() タスクごとに新しいスレッドを立ち上げるスケジューラ。従ってioスケジューラ同様無制限にタスクが増えすぎてパフォーマンスの低下やOOMに注意する。
Schedulers.trampoline() FIFOでキューに積まれた順にタスクを実行するスケジューラ
AndroidSchedulers.mainThread() タスクをAndroidのメインスレッドで実行するスケジューラ

オペレータ

Observableを作ったり、加工したり変換したりするための命令

//TからObservableを作る
.just
//TからUへ1対1に変換する
.map

など

膨大にあるらしい
よって省略

subscribe

これまでに設計図、スレッド処理、加工などを行って最後に実行するものが必要となります。それがsubscrivbe()になります。
このタイミングで処理が開始され、コーヅバックに結果が通知される

.subscribe()

終わり

基本的なので実際に使って行く際にはまた別の記事等参考にしてみてください。

参考サイト

RxJava+RetrofitでAPI通信周りを実装する上で最低限の知識
https://qiita.com/FumihikoSHIROYAMA/items/201536d9b45ef21b6bc7
RxJavaに3日で入門し、、
https://qiita.com/yuya_presto/items/152fa80d073d865cfc90

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした