Kotlin学習ノート(六)-kotlin協程の掛け
6289 ワード
launch
とasync
はいずれもコヒーレンスを作成することができ、いずれもCoroutine
を返し、async
が返したCoroutine
余りがDeferred
インタフェース(遅延取得結果)を実現したにすぎない.Deferred.await()
を呼び出すと結果が得られ、前の例ではval coroutineScope: CoroutineScope = CoroutineScope(Dispatchers.Main)
coroutineScope.launch {
val avatar: Deferred<Any> = async { api.getAvatar(user) } // Deferred
val logo: Deferred<Any> = async { api.getCompanyLogo(user) } // logo Deferred
show(avatar.await(), logo.await()) // deferred await
}
await
関数public suspend fun await(): T // suspend
suspendサスペンション
作成されたコンシステントは、
suspend
関数に実行されると、現在のスレッドから保留され、このコンシステントコードは一時的に実行されません.例val coroutineScope: CoroutineScope = CoroutineScope(Dispatchers.Main)
coroutineScope.launch {
val image = suspendingGetImage("imageID") //
iv.setImageBitmap(image) //
}
suspend fun suspendingGetImage(id: String) {
withContext(Dispatchers.IO) {
//
}
}
suspendingGetImage()
まで実行されると保留され、suspend
関数からsuspend関数で指定されたスレッド、例えば例中のwithContext
で指定されたDispatchers.IO
スレッドに向かって実行が継続される.Dispatchers
には3つのタイプがありますDispatchers.Main:Android
Dispatchers.IO: IO , IO , : ,
Dispatchers.Default: CPU ,
指定したスレッドが実行されると、自動的に元のスレッド、すなわち例のメインスレッドに戻ります.
suspend suspend , suspend 。
どのようにして保留操作を実現しますか?
カスタム
suspend
宣言の関数は、その関数が保留されることを示すだけであるが、保留操作はkotlin
フレームワーク内の保留関数、例えばwithContext
であり、保留操作を実現するために、suspend
宣言のみであれば、IDEは、保留関数によって切り替えるスレッドを指定していないため、キーワードが余分であることを示す. , suspend : ,
, 。
, suspend , , Kotlin suspend ,
suspend 。
その他の保留関数
withContext
保留関数に加えて、delay
は、コードをしばらく待ってから実行し続ける役割を果たします.例suspend fun suspendingGetImage(id: String) {
delay(5)
//
}