RxJava最初の最初

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

自分が初めて勉強した時に、ひたすら調べてまとめた感じなのでこれを読んで雰囲気でも感じとってもらえれば幸いです。
#RxJavaとは
非同期なイベントベースのプログラムを合成するライブラリ


最初はなんじゃこりゃって感じなので流して最後に読んだら
少しあーってなります
・Observableからはitemが同期的or非同期に流れてくる（ストリームと言う）
・Observable.from(List)を使うと、Listの中身が１つずつ流れてくる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