Android のコルーチン
Jan 29 2023
コルーチンとは何ですか? コルーチンは、メインスレッドをブロックしてアプリが応答しなくなる可能性がある長時間実行タスクの管理に役立ちます。コルーチンは、Android で非同期に実行されるコードを簡素化するために使用できる同時実行設計パターンです。
コルーチンとは何ですか?
コルーチンは、メインスレッドをブロックしてアプリが応答しなくなる可能性がある長時間実行タスクの管理に役立ちます。コルーチンは、Android で非同期に実行されるコードを簡素化するために使用できる同時実行設計パターンです。
上の図からわかるように、メインスレッドでは小さな操作のみを実行できます。メインスレッドで長時間実行される操作を実行したい場合、アプリがクラッシュして遅くなる可能性があります。または、いいえを作成した場合。バックグラウンド/ワーカー スレッドの場合、メモリ不足の問題が発生します。コルーチンは、呼び出し元に制御を意図的に渡しますが、プロセス内のコンテキストを終了せず、アイドル状態に維持する特別なタイプの関数です。
コルーチンの使い方
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:x.x.x"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:x.x.x"
}
- Main: UI スレッドを使用します。Rx では AndroidSchedulers.MainThread() に似ています
- デフォルト: CPU を 集中的に使用するタスクに使用されます 。 利用可能な CPU コアと同じ数のスレッドを使用します。これらは CPU を集中的に使用するタスクであるため、CPU がビジー状態になるため、多くのスレッドを実行しても意味がありません。Rx の Schedulers.computation() に似ています。
- IO: 入力/出力に使用されます。 API へのリクエスト、DB へのアクセスなど。Rx の Schedulers.io() に似ています。
- ジョブ:基本的にバックグラウンドで実行されるタスクであり、完了すると破棄されるライフサイクルを持つアクションとして解釈できます。
- ジョブを使用してさまざまな操作を実行する場合: Job.join
- すべての子ジョブをキャンセルする場合: Job.cancel
- withContext: await() を記述する必要がない非同期を記述する別の方法。
suspend fun fetchUser() = withContext(Dispatchers.IO) {
// make network call
// return
}
Suspend : その名前が示すように、これらはある時点でコルーチンの実行を一時停止し、結果の準備ができたら再び関数の実行を再開する関数です。
suspend fun makeNetworkRequest() {
// fetchData is another suspend function, so 'makeNetworkRequest' is going to be `suspended`
// until it's result becomes available, without blocking the main thread.
val result = fetchData()
// continues executing once the result becomes available
show(result)
}
// fetchData is main thread safe
suspend fun fetchData(): Result { ... }
起動はメインスレッドをブロックしませんが、一方で、起動は中断呼び出しではないため、コードの残りの部分の実行は起動結果を待ちません。
fun GFG()
{
var resultOne = "Android"
var resultTwo = "Kotlin"
Log.i("Launch", "Before")
launch(Dispatchers.IO) { resultOne = function1() }
launch(Dispatchers.IO) { resultTwo = function2() }
Log.i("Launch", "After")
val resultText = resultOne + resultTwo
Log.i("Launch", resultText)
}
suspend fun function1(): String
{
delay(1000L)
val message = "function1"
Log.i("Launch", message)
return message
}
suspend fun function2(): String
{
delay(100L)
val message = "function2"
Log.i("Launch", message)
return message
}
Async はコルーチンの開始にも使用されますが、プログラム内のawait()関数のエントリ ポイントでメイン スレッドをブロックします。
fun GFG
{
Log.i("Async", "Before")
val resultOne = Async(Dispatchers.IO) { function1() }
val resultTwo = Async(Dispatchers.IO) { function2() }
Log.i("Async", "After")
val resultText = resultOne.await() + resultTwo.await()
Log.i("Async", resultText)
}
suspend fun function1(): String
{
delay(1000L)
val message = "function1"
Log.i("Async", message)
return message
}
suspend fun function2(): String
{
delay(100L)
val message = "function2"
Log.i("Async", message)
return message
}
コルーチンを使用する利点
- コルーチンは軽量スレッドです
- コルーチンは並行して実行でき、相互に待機し、相互に通信できます。
- メモリの問題を発生させずに数千のコルーチンを作成
- 最新のアプリケーションに最適

![とにかく、リンクリストとは何ですか?[パート1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































