Kotlin学習ノート(六)-kotlin協程の掛け

6289 ワード

launchasyncはいずれもコヒーレンスを作成することができ、いずれも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)
    //   
}