[Android] お寿司屋で例えるAndroid Architecture Compoment 第四貫:Coroutines


この記事は

お寿司屋で例えるAndroid Architecture Compoment 第三貫:LiveDataの続きです

これまで

MVVMをこんな感じでお寿司屋に例えたとさ

View(Activity/Fragment)はお客さん

ViewModelが板前さん

Repositoryが、漁師

Modelが、海

MVVMを海からお魚を取ってきてお客さんに提供するまでの役割を分割したものと捉えています。
詳しくは、第一貫をご覧ください。(5分位で読める内容ですよ!)

こんな感じのアプリを作ったとさ

今回このシリーズを通して実装する事は、お寿司屋で例えるAndroid Architecture Compoment ということで、アプリ自体も先ほど共有したお寿司屋さんの流れを踏襲します。
こんな感じのアプリ作りまーす!

マグロしか食べてなかったり、小学生女子が下校途中にお寿司屋に寄っていたりとツッコミどころがありますが、スルーしてください。
先程のMVVMの例えと、アプリの例えが少し違いがありますが、こちらもスルーで。

View(お客さん)

注文画面を表示

ViewModel(板前さん)

注文画面のデータや処理を保持

Model

注文履歴を保持

本題

どもども、Reoです。
さて、前回のアプリでこんなコードがありました。

OrderViewModel.kt
            "帰る" -> {
                viewModelScope.launch {
                    _orderImage.value = R.drawable.tsugaku
                    _orderText.value = ""
                    delay(1000)
                    _orderImage.value = R.drawable.home_kitaku_girl
                    _orderText.value = "再入店"
                }
            }

viewModelScope.launchという部分です。
説明してなかったので、????と思った方もいるかもしれません。
これは、Coroutinesと呼ばれるものです。

Coroutinesとは?

コルーチンとは、Android で使用できる並行実行のデザイン パターンです。これを使用すると、非同期実行するコードを簡略化できます。

んー、やはりドキュメントは、小難しい日本語ですね。
取り敢えず、お寿司屋に例えるしかないようですね。

Coroutinesとは、簡単に言うと「分身作り」を実現できるものです。

Coroutinesをお寿司屋で例えてみる

さて、大変です。
とある、お寿司屋でバイトしているR君。
しかし、R君は明日テストにもかかわらずバイトを入れてしましました。
しかも、とある提出課題が全く終わってない。
バイトは、絶賛繁忙期中で、22時まであるので帰ったらとてもじゃないけど、取り掛かる気力がない。
どうしようか…

困っていると、急に光が…

????「お困りかい。では、君に空間を操る能力を捧げよう!はぁぁぁぁぁぁぁぁっぁぁぁぁぁぁぁぁぁl!!!!」

R君「なんだ。このみなぎる力は…」

R君「うぁぁぁぁぁぁぁぁぁぁぁl!!
ここは、家?
僕は、確かバイトだったはず。
ん?なんだ、この水晶玉は?
これは…、(目の前には、バイトをしている自分の姿が水晶玉の中に写っている)
良く分からない、でもこれは課題をやるチャンスだ。(理解力高いのか、アホなのか分からんw)
よし!やるぞぉぉぉ!

3時間後…
こうして、R君は無事課題を終えることに成功したのである。

寸劇が終わったところで…

Coroutinesというのは、現実世界だとR君みたいに分身を作る事が出来ます。

どういうことかというと、基本的に、アプリはメインスレッドと言われる一つのフロー、いわゆる逐次処理が施されます。
スレッドは、一つの分身の事だと思うと分かりやすいと思います。
つまり、アプリは一人の人間で切り盛りしている感じです。
その為、何かを考えながら別のことを考えたり、といったリアルタイムなマルチタスクは出来ないでいます。

しかし、Coroutinesのような非同期処理を使うと複数のスレッドを作り、ながら処理をすることが出来ます。
ちなみに、Coroutinesは、無限にスレッドを作れたはず…

だから、R君は一人はバイト、もう一人は課題をやるみたいなことが出来たのです。

もう少し理論的な事に触れてみましょうw
他には、どんな時に使うのか。

例えば、とあるランニングアプリにて。

ランニングが終わって、終了ボタンを押します。
そして、走った距離などのデータをローカルに保存します。

では、このデータを保存する処理が重くてメインスレッドだけで、つまり一人の人間だけでやるとしたらどうなるか?

お寿司屋の例でいうと、一人でマグロを握りながら、レジも担当するみたいな離れ業をするようなものです。
実際、ソフトウェアの世界でも出来ません。
逐次処理が、原則なので。
一つ一つ順に終わらせようとすると、必ずどこかの処理は待たなくてはならない場面が出てきます。
マグロに専念すると、必ずレジは混みます。
待たせるのは、良くないことですよね。

先程のランニングアプリに繋げます。
待つというのは、皆さん経験あると思いますが、プログレスバーが全然進捗しない、あのあれ!です。
ストレス半端ないですよね!!(そんで、一気に進むのあるあるですよねw)
Coroutinesによって分身を作り、一つはランニング終了の画面を表示させ、もう一つはデータを保存する処理をするなどする必要があります。
つまり、ユーザーのUI/UXの観点からもCoroutinesを使用する意義は出てきます。

※ちなみに、Databaseの操作は、メインスレッドでは出来ない決まりになっています。IOスレッドという場所で実行されます。また、メインスレッド以外でUIの操作はできないのでIOスレッドでViewの操作をするとクラッシュするのでご注意を。

空間を操る力を手にする方法

皆さんも欲しいのではないでしょうか?この能力…
特別にその能力を身に付ける方法をお教えしましょう…

build.gradle(app
dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
}
//Activity内だと
Global.launch {
  ...
}


//Fragment内だと
lifecycleScope.lauch {
    ...
}

//ViewModel内だと
viewModelScope.launch {
    ...
}

{}内に処理を書くと、それが非同期処理で実行されます。

第5貫へ続く