Kotlin Coroutineについてのアウトプット

Coroutine関数
---

今回は、この学習教材を利用してkotlin coroutineを勉強したので早速アウトプットします。
参考URL→https://www.youtube.com/watch?v=ShNhJ3wMpvQ
#####(英語での学習になります!)

このコルーチン関数のメリットは、非同期処理を行うことができることです。
上から下に処理を行っていくような通常な処理では、モバイルアプリに対応するのが難しいのでこの非同期処理ができるかできないかで処理速度の効率が変わってきます。

##簡単なCoroutine![スクリーンショット (387).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/c12e57c2-cc0f-da9b-4920-b20b0ea546bc.png)

通常なら、上から下に処理が進むはずですがこの場合
3s後に、Logの内容が表示されるような処理になっています。

つまり、先にどのスレッドから呼び出されるかがわかるということです!


##launchにパラメータを持たせよう

<dl>
<dt>launchに持たせることのぱらーめの種類</dt>
<dd>Dispatchers.Main→メインスレッドで処理を行い処理が軽いものに適している</dd>
<dd>Dispatchers.IO→ネットワーク、データベースとの処理の時に適している</dd>
<dd>Dispatchers.Default→作業量が大きく負荷の高い処理に適しています</dd>
</dl>

#####状況に合わせてパラメータを与えることで処理を最適化することができる!

![スクリーンショット (390).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/e68a3c32-2a4c-3ba4-f329-65f49a74acd2.png)

withContextを用いることで、自動でビューに表示する内容を変更してくれる!

######Coroutineをうまく使い、処理の最適解を見つけることができるならコードの量を減らすことができる。


##RunBlocking

<dt>RunBlockingとは?</dt>
<dd>→処理を中断し、コルーチン関数が終わるまで次の処理が行わせない</dd>

![スクリーンショット (391).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/22ba8b2e-2afb-7767-9cbb-31c7d7578163.png)

・runBlockingの中身の処理が終わるまで次の処理に移ることがないことをわかりやすくするための練習問題がこれです。

![スクリーンショット (393).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/506fab75-5d14-98d5-3854-e63466e9fb49.png)

どの順になるか予想できましたか??
答えは→1,5,3,2,4です。

##コルーチン関数の中断、処理終了後の処理

#####まず繰り返し処理終了後から
![スクリーンショット (396).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/8cf587d9-f630-828c-169c-877e818c2ce5.png)

5回の繰り返しが終わった後に、runBlockingの処理が実行されます。

#####コルーチン関数の中断の処理
![スクリーンショット (398).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/90db1b28-b056-b463-f9d5-3d8fe9f6b773.png)

この時に注意しないといけないことは、非同期処理にコルーチン関数は夢中なので中断されたことに気づかずに中断のLog表示が出ても繰り返し処理を行ってしまうので、条件構文でActiveなのかどうかを確認して処理を中断させる必要があります。

また、別の方法として以下の方法があります。
![スクリーンショット (399).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/6e90e32e-72f8-2bd6-3246-e716466e5232.png)

wighTimeoutの引数に時間を与えることで処理を中断できるので、runblockingの処理が必要なくなります。
ですが、同様に処理を中断したかどうかの判断をコルーチン関数に与えないと処理を止めることができないので、
#####中断の処理には注意が必要です。

##よくある間違い

次のようなコルーチン関数の使い方は注意が必要です。
![スクリーンショット (400).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/74098155-c591-9037-a8aa-a792dba842b8.png)

この処理を実行すると、三秒後に各Logが表示されるではないかと考えませんか?
→少なくとも私はそう感じてしまいました。

この処理を行うと、コルーチン関数すべての処理が終わってからLog表示なので3秒後に表示したくても6秒かかってしまいます。

こうしたミスを減らすには、以下の二つのコーディング方法があります。

###1つ目
![スクリーンショット (401).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/3f7751d3-bf52-017a-e02f-1e185789c263.png)

初期化をおくらせて、コルーチン関数の中で初期化をして処理が終わってからLog表現という方法があります。
ですが、次の方法を使えばよりスマートなコードになります。

###2つ目
![スクリーンショット (402).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975701/14334a12-748f-fc20-9def-594a5a0d5f9b.png)

####asyncを使った処理を用いることです!

→この処理とlaunchの違いは、戻り値を含むsuspend関数に対応できるかどうかの違いがあります。
(ここの訳を間違ってたらすいません。)

また、.join()でコルーチン関数の処理を待っていたものを
#####.await()にすることでよりスマートなコードになっています。


---

以上簡単でしたが、コルーチン関数についてべんきょして分かったことをアウトプットしてみました。

英語の動画ですがとても分かりやすかったので初学者の方にお勧めできます。

参考URL→https://www.youtube.com/watch?v=ShNhJ3wMpvQ