วิธีการ "เรียกวิธีการบล็อกที่ไม่เหมาะสม" เหมาะสมหรือไม่


29

ขณะนี้ฉันกำลังพยายามใช้ kotlin coroutines เพิ่มเติม แต่ฉันประสบปัญหา: เมื่อใช้ moshi หรือ okhttp ภายใน coroutines เหล่านี้ฉันได้รับคำเตือน:

"เรียกวิธีการบล็อกที่ไม่เหมาะสม"

วิธีที่ดีที่สุดในการแก้ไขปัญหาเหล่านี้คืออะไร ฉันไม่ต้องการที่จะไม่เหมาะสม ;-)


ฉันคิดว่าคุณไม่ต้องการที่จะระงับการเตือนคุณ?
Saeed Entezari

คำตอบ:


12

คำเตือนเกี่ยวกับวิธีการที่บล็อกเธรดปัจจุบันและ coroutine ไม่สามารถถูกระงับได้อย่างถูกต้อง ด้วยวิธีนี้คุณจะสูญเสียผลประโยชน์ทั้งหมดของ coroutines และลดระดับเป็นหนึ่งงานต่อเธรดอีกครั้ง

ควรจัดการแต่ละกรณีด้วยวิธีที่แตกต่างกัน สำหรับการโทร http suspendable คุณสามารถใช้ktor http ลูกค้า แต่บางครั้งไม่มีไลบรารี่สำหรับกรณีของคุณดังนั้นคุณสามารถเขียนวิธีแก้ปัญหาของคุณเองหรือเพิกเฉยต่อคำเตือนนี้ได้


20
การเพิกเฉยต่อคำเตือนนั้นแทบจะไม่ถูกต้องนัก แต่อย่างน้อยคุณก็สามารถเรียกใช้โค้ดการบล็อกwithContext(Dispatchers.IO)ได้
Marko Topolnik

2
หากคุณเรียกใช้รหัสการปิดกั้นด้วยwithContext(Dispatchers.IO)จะไม่ถูกปิดกั้นอีกต่อไปและคำเตือนไม่ถูกต้องใช่ไหม
โนแลน

@noloman คำถามที่ดีเพราะ "อย่างน้อย" ถือว่าความรู้ที่คนที่ถามคำถามนี้ไม่มี ยังคงคำเตือนไม่หายไปเมื่อคุณแนะนำเสื้อคลุมนี้
อเล็กซ์

14

นอกจากนี้คุณยังได้รับคำเตือนนี้เมื่อเรียกใช้ฟังก์ชันระงับที่มีคำอธิบายประกอบด้วย@Throws(IOException::class)(Kotlin 1.3.61) ไม่แน่ใจว่ามีจุดประสงค์หรือไม่ อย่างไรก็ตามคุณสามารถแก้ไขคำเตือนนี้โดยการเอาคำอธิบายประกอบหรือเปลี่ยนไปExceptionระดับ


ลองเรียกมันว่าการยับยั้งไม่ต้องแก้ไข :) ฉันคิดว่าตัววิเคราะห์แบบคงที่เน้นมันเพราะวิธีการที่พ่น IOException มักจะบล็อกและใช้เวลาอันมีค่าในการทำให้เสร็จ
Ivan Shafran

ฉันพบคำอธิบายนี้เกี่ยวกับ IOException ที่เป็นประโยชน์: discuss.kotlinlang.org/t/…
Ivan Shafran
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.