Làm thế nào để làm cho phương thức chặn không phù hợp của cuộc gọi Gọi phù hợp?


29

Tôi hiện đang cố gắng tận dụng các coroutines kotlin nhiều hơn. Nhưng tôi phải đối mặt với một vấn đề: khi sử dụng moshi hoặc okhttp bên trong các coroutines này, tôi nhận được một cảnh báo:

"cuộc gọi phương thức chặn không phù hợp"

Cách tốt nhất để khắc phục những điều này là gì? Tôi thực sự không muốn là không phù hợp ;-)


Tôi cho rằng bạn không muốn ngăn chặn cảnh báo, phải không?
Saeed Entezari

Câu trả lời:


12

Cảnh báo là về các phương pháp chặn luồng hiện tại và coroutine không thể bị treo đúng cách. Bằng cách này, bạn mất tất cả các lợi ích của coroutines và hạ cấp xuống một công việc trên mỗi luồng một lần nữa.

Mỗi trường hợp nên được xử lý theo một cách khác nhau. Đối với các cuộc gọi http đáng ngờ, bạn có thể sử dụng ứng dụng khách ktor http . Nhưng đôi khi không có thư viện cho trường hợp của bạn, vì vậy bạn có thể viết giải pháp của riêng bạn hoặc bỏ qua cảnh báo này.


20
Bỏ qua cảnh báo gần như không bao giờ là điều đúng đắn, ít nhất bạn có thể chạy mã chặn withContext(Dispatchers.IO).
Marko Topolnik

2
nếu bạn chạy mã chặn withContext(Dispatchers.IO)thì nó sẽ không chặn nữa và cảnh báo không đúng, phải không?
noloman

@noloman câu hỏi hay vì "ít nhất" giả định kiến ​​thức mà ai đó đang hỏi câu hỏi này không có. Tuy nhiên, cảnh báo sẽ không biến mất khi bạn giới thiệu trình bao bọc này.
Alex

14

Bạn cũng nhận được cảnh báo này khi gọi một chức năng tạm dừng được chú thích bằng @Throws(IOException::class)(Kotlin 1.3.61). Không chắc đó có phải là dự định hay không. Dù sao, bạn có thể sửa cảnh báo này bằng cách xóa chú thích đó hoặc thay đổi nó thành Exceptionlớp.


Chúng ta hãy gọi nó là triệt tiêu, không sửa chữa :) Tôi cho rằng, bộ phân tích tĩnh làm nổi bật nó bởi vì phương thức ném IOException thường chặn và mất một thời gian quý giá để hoàn thành.
Ivan Shafran

Tôi thấy lời giải thích này về IOException hữu ích: thảo luận.kotlinlang.org / t / Kẻ
Ivan Shafran
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.