คำถามติดแท็ก kotlin-coroutines

6
อะไรคือความแตกต่างระหว่างการเปิดตัว / เข้าร่วมและ async / ที่รอใน Kotlin coroutines
ในkotlinx.coroutinesไลบรารีคุณสามารถเริ่ม coroutine ใหม่โดยใช้launch(กับjoin) หรือasync(พร้อมawait) ความแตกต่างระหว่างพวกเขาคืออะไร?

6
ฟังก์ชัน Suspend หมายถึงอะไรใน Kotlin Coroutine
ฉันกำลังอ่าน Kotlin Coroutine และรู้ว่ามันขึ้นอยู่กับsuspendฟังก์ชัน แต่suspendหมายความว่าอย่างไร? โครูทีนหรือฟังก์ชันถูกระงับ? จากhttps://kotlinlang.org/docs/reference/coroutines.html โดยทั่วไปโครูทีนคือการคำนวณที่สามารถระงับได้โดยไม่ต้องบล็อกเธรด ฉันได้ยินคนพูดว่า "ระงับฟังก์ชัน" บ่อยๆ แต่ฉันคิดว่ามันเป็นโครูทีนที่ถูกระงับเพราะรอให้ฟังก์ชันเสร็จสิ้น? "ระงับ" มักจะหมายถึง "หยุดการทำงาน" ในกรณีนี้โครูทีนไม่ได้ใช้งาน 🤔เราควรบอกว่าโครูทีนถูกระงับหรือไม่? โครูทีนใดถูกระงับ จากhttps://kotlinlang.org/docs/reference/coroutines.html หากต้องการดำเนินการเปรียบเทียบต่อไป await () อาจเป็นฟังก์ชันระงับ (ดังนั้นจึงสามารถเรียกได้จากภายในบล็อก async {}) ที่ระงับโครูทีนจนกว่าการคำนวณบางส่วนจะเสร็จสิ้นและส่งคืนผลลัพธ์: async { // Here I call it the outer async coroutine ... // Here I call computation the inner coroutine val result = …

3
Kotlin: withContext () เทียบกับ Async-await
ฉันอ่านเอกสาร kotlinแล้วและถ้าฉันเข้าใจอย่างถูกต้องฟังก์ชัน Kotlin ทั้งสองจะทำงานดังนี้: withContext(context): สลับบริบทของโครูทีนปัจจุบันเมื่อบล็อกที่กำหนดดำเนินการโครูทีนจะสลับกลับไปยังบริบทก่อนหน้า async(context): เริ่มโครูทีนใหม่ในบริบทที่กำหนดและหากเราเรียก.await()ใช้Deferredงานที่ส่งคืนมันจะระงับการเรียกโครูทีนและกลับมาทำงานต่อเมื่อบล็อกที่ดำเนินการภายในโครูทีนที่ถูกสร้างจะส่งกลับ ตอนนี้สำหรับสองเวอร์ชันต่อไปนี้code: เวอร์ชัน 1: launch(){ block1() val returned = async(context){ block2() }.await() block3() } เวอร์ชัน 2: launch(){ block1() val returned = withContext(context){ block2() } block3() } ในทั้งสองเวอร์ชัน block1 (), block3 () ดำเนินการในบริบทเริ่มต้น (commonpool?) โดยที่ block2 () ดำเนินการในบริบทที่กำหนด การดำเนินการโดยรวมเป็นแบบซิงโครนัสกับคำสั่ง block1 () -> block2 () …

2
วิธีการ "เรียกวิธีการบล็อกที่ไม่เหมาะสม" เหมาะสมหรือไม่
ขณะนี้ฉันกำลังพยายามใช้ kotlin coroutines เพิ่มเติม แต่ฉันประสบปัญหา: เมื่อใช้ moshi หรือ okhttp ภายใน coroutines เหล่านี้ฉันได้รับคำเตือน: "เรียกวิธีการบล็อกที่ไม่เหมาะสม" วิธีที่ดีที่สุดในการแก้ไขปัญหาเหล่านี้คืออะไร ฉันไม่ต้องการที่จะไม่เหมาะสม ;-)

3
Kotlin Flow กับ Android LiveData
ฉันมีคำถามบางอย่างเกี่ยวกับ Kotlin Flow ฉันสามารถสังเกต LiveData ได้จากหลายแฟรกเมนต์ ฉันสามารถทำสิ่งนี้กับ Flow ได้หรือไม่ ถ้าใช่แล้วได้อย่างไร เราสามารถมี LiveData หลายรายการจาก LiveData เดียวโดยใช้&map switchMapมีวิธีใดที่จะมีการไหลหลายครั้งจากการไหลของแหล่งเดียว? ใช้MutableLiveDataฉันสามารถปรับปรุงข้อมูลได้จากทุกที่โดยใช้การอ้างอิงตัวแปร มีวิธีใดที่จะทำเช่นเดียวกันกับ Flow ฉันมีกรณีใช้: ฉันจะสังเกตการSharedPreferencesใช้callbackFlow{...}ซึ่งจะให้ฉันไหลที่มาเดียว จาก Flow นั้นฉันต้องการสร้าง Flow หลายรายการสำหรับคู่คีย์ - ค่าแต่ละคู่ คำถามเหล่านี้อาจฟังดูไร้สาระ ฉันใหม่สำหรับ Rx และ Flow โลก

3
ฟังก์ชั่น withTimeout ให้ IllegalStateException: ไม่มีการวนรอบเหตุการณ์ ใช้ runBlocking {…} เพื่อเริ่ม ในไคลเอนต์ Kotlin Multiplatform iOS
อัปเดต: ใช้งานได้ถ้าฉันเรียกใช้งาน coroutine ครั้งแรกโดยไม่ต้องหมดเวลาและด้วย withTimeout แต่ถ้าฉันรัน coroutine ด้วย Timeout ก่อนมันจะทำให้ฉันมีข้อผิดพลาด กันไปสำหรับ Async เช่นกัน ฉันกำลังสร้างแอพพลิเคชั่น kotlin Multicode ซึ่งฉันกำลังเรียกใช้ API ด้วย ktor ฉันต้องการมีฟังก์ชั่นไทม์เอาต์ที่กำหนดค่าได้ในคำขอ ktor ดังนั้นฉันจึงใช้ withTimeout ที่ระดับ coroutine นี่คือการเรียกใช้ฟังก์ชั่นของฉันกับเครือข่าย API suspend fun <T> onNetworkWithTimeOut( url: String, timeoutInMillis: Long, block: suspend CoroutineScope.() -> Any): T { return withTimeout(timeoutInMillis) { withContext(dispatchers.io, block) } as …

2
Kotlin Flow กับ LiveData
ใน Google I / O ล่าสุด Jose Alcerreca และ Yigit Boyar บอกกับเราว่าเราไม่ควรใช้ LiveData เพื่อดึงข้อมูลอีกต่อไป ตอนนี้เราควรใช้ฟังก์ชั่นระงับสำหรับการดึงข้อมูลครั้งเดียวและใช้ Flow ของ Kotlin เพื่อสร้างกระแสข้อมูล ฉันยอมรับว่า coroutines นั้นยอดเยี่ยมสำหรับการดึงข้อมูลแบบครั้งเดียวหรือการดำเนินการ CRUD อื่น ๆ เช่นการแทรกเป็นต้น แต่ในกรณีที่ฉันต้องการสตรีมข้อมูลฉันไม่เข้าใจว่าข้อดีของโฟลว์คืออะไร สำหรับฉันแล้วดูเหมือนว่า LiveData ก็ทำเช่นเดียวกัน ตัวอย่างที่มี Flow: ViewModel val items = repository.fetchItems().asLiveData() กรุ fun fetchItems() = itemDao.getItems() เชียงดาว @Query("SELECT * FROM item") fun getItems(): Flow<List<Item>> …

2
Corotines Kotlin“ รับประกันก่อนเกิด”
corotines Kotlin ให้การรับประกัน "ที่เกิดขึ้นก่อนหน้า" หรือไม่? ตัวอย่างเช่นมีการรับประกัน "ที่เกิดขึ้นก่อน" ระหว่างการเขียนถึงmutableVarและการอ่านในภายหลัง (อาจ) เธรดอื่น ๆ ในกรณีนี้: suspend fun doSomething() { var mutableVar = 0 withContext(Dispatchers.IO) { mutableVar = 1 } System.out.println("value: $mutableVar") } แก้ไข: บางทีตัวอย่างเพิ่มเติมอาจทำให้คำถามชัดเจนขึ้นเพราะมันมากขึ้น Kotlin-ish (ยกเว้นความไม่แน่นอน) โค้ดนี้ปลอดภัยสำหรับเธรดหรือไม่: suspend fun doSomething() { var data = withContext(Dispatchers.IO) { Data(1) } System.out.println("value: ${data.data}") } private data …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.