發表文章

目前顯示的是有「coroutine」標籤的文章

Android Coroutine Recipes

圖片
本文的原始碼可以在 YangQiRen/coroutine-recipes 中找到 基於Coroutine v1.0.0版本 引入依賴 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0' 如何啟動協程(Coroutine) 在 kotlinx.coroutines 庫中,您可以使用 launch 或 async 函數來啟動新的協程。 從概念上講, async 就像 launch 。它啟動一個單獨的協程,這是一個輕量級線程,可與所有其他協程同時工作。區別在於, launch 返回一個 Job 且不攜帶任何結果值,而 async 返回一個 Deferred 輕量無阻塞的未來,表示希望稍後提供結果。您可以使用 .await() 延期的值來獲得其最終結果,但是 Deferred 它也是一個 Job ,因此可以根據需要取消它。 ***重點*** 如果裡面的代碼 launch 以異常終止,然後將其視為未捕獲線程中的異常會使Android應用程序崩潰。內部未捕獲的異常 async 代碼存儲在結果中 Deferred 並且不會在其他任何地方交付,除非經過處理,否則它將被靜默丟棄。 協程調度員(Coroutine Dispatcher) 在Android中,我們通常使用兩個調度程序: uiDispatcher將執行分派到Android主UI線程(用於父協程)。 bgDispatcher在後台線程中分派執行(用於子協程)。 //將執行分派到Android主線程中 val uiDispatcher:CoroutineDispatcher = Dispatchers.Main //將共享線程池表示為協程分派器 val bgDispatcher:CoroutineDispatcher = Dispatchers.I0 在下面的例子中,我們將使用 CommonPool 用於 bgContext 這限制並行運行為值64個線程或核的數量