LoginSignup
0
1

More than 3 years have passed since last update.

RxJavaの基本的な処理シーケンス(古め)

Last updated at Posted at 2020-12-26

Reactiveの勉強記事

Reactiveを理解したいが何もわからんので、
Reactive Programming With RxJava のサンプルコードが、裏でどのように動いているのかを記述していく。

2016年の本なので、Observable.create のような Deprecatedとなっている古いAPIなどを使用している。

RxJava

簡単な登場人物

study-RxJava.png

store-uml-RxJava_2.png

シンプル

fun main(args: Array<String>) {
    Observable.create<String> { s ->
        s.onNext("one")
        s.onCompleted()
    }.subscribe { s -> println("VALUE -> $s") }
}

store-uml-RxJava_sequence1.png

  • create {s -> s.OnNext("one") ...}
    • 引数のラムダ式は OnSubscribe の実装として解釈される。
  • subscribe { s -> println("VALUE -> $s") }
    • 引数のラムダ式は Action1 という内部的に使用されるインターフェイスの実装となる、
    • subscribe の内部で Action1 をwrapして Subscriber のインスタンスを作成
    • その後 OnSubscribecall を呼び出す。
      • これによって create の引数のラムダ式が呼び出される。
      • call の引数は直前に作成した Subscriber
    • ラムダ式は引数の Subscriber に対して、 onNext を呼び出す。
    • SubscriberonNext は、 subscribe の引数のラムダ式をcallすることで呼び出す。

doOnNext

fun main(args: Array<String>) {
    Observable.create<String> { s ->
        s.onNext("one")
        s.onCompleted()
    }.doOnNext { i -> println("doOnNext $i") }
            .subscribe { s -> println("VALUE -> $s") }
}

store-uml-RxJava_sequence2.png

オレンジが doOnNext 関連によって作成される処理
proxy的な動きをしていることがわかる

map

fun main(args: Array<String>) {
    Observable.create<String> { s ->
        s.onNext("one")
        s.onCompleted()
    }.map { "hello $it" }
            .subscribe { s -> println("VALUE -> $s") }
}

store-uml-RxJava_sequence3.png

doOnNext とほぼ同じ動作

別ThreadからのPublisher

fun main(args: Array<String>) {
    println(Thread.currentThread())
    Observable.create<String> { s ->
        Thread {
            println(Thread.currentThread())
            s.onNext("one")
            s.onNext("two")
            s.onCompleted()
        }.start()
    }.subscribe { s -> println("VALUE -> $s by ${Thread.currentThread()}") }
}

// 出力結果
Thread[main,5,main]
Thread[Thread-0,5,main]
VALUE -> one by Thread[Thread-0,5,main]
VALUE -> two by Thread[Thread-0,5,main]
VALUE -> three by Thread[Thread-0,5,main]

store-uml-RxJava_sequence4.png

別スレッドでpublishされた場合は、そのスレッドでsubscribeされる。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1