Bagaimana cara membuat "panggilan metode pemblokiran yang tidak pantas" tepat?

29

Saat ini saya mencoba meningkatkan leverage kotlin lebih banyak. Tapi saya menghadapi masalah: ketika menggunakan moshi atau okhttp di dalam coroutine ini saya mendapat peringatan:

"panggilan metode pemblokiran yang tidak pantas"

Apa cara terbaik untuk memperbaikinya? Aku benar-benar tidak ingin menjadi tidak pantas ;-)

ligi
sumber
Saya berasumsi Anda tidak ingin menekan peringatan itu, bukan?
Saeed Entezari

Jawaban:

12

Peringatannya adalah tentang metode yang memblokir utas dan coroutine saat ini tidak dapat ditangguhkan dengan benar. Dengan cara ini, Anda kehilangan semua manfaat coroutine dan downgrade ke satu pekerjaan per utas lagi.

Setiap kasus harus ditangani dengan cara yang berbeda. Untuk panggilan http yang dapat ditangguhkan, Anda dapat menggunakan klien http ktor . Tetapi kadang-kadang tidak ada perpustakaan untuk kasus Anda, jadi Anda bisa menulis solusi sendiri atau mengabaikan peringatan ini.

Evgeny Bovykin
sumber
21
Mengabaikan peringatan hampir tidak pernah benar, Anda setidaknya dapat menjalankan kode pemblokiran withContext(Dispatchers.IO).
Marko Topolnik
2
jika Anda menjalankan kode pemblokiran withContext(Dispatchers.IO)maka tidak lagi memblokir dan peringatannya tidak benar, bukan?
noloman
@noloman pertanyaan yang bagus karena "setidaknya" mengasumsikan pengetahuan bahwa seseorang yang mengajukan pertanyaan ini tidak memiliki. Namun peringatan tidak hilang ketika Anda memperkenalkan pembungkus ini.
Alex
14

Anda juga mendapatkan peringatan ini saat memanggil fungsi menangguhkan yang dijelaskan dengan @Throws(IOException::class)(Kotlin 1.3.61). Tidak yakin apakah itu dimaksudkan atau tidak. Bagaimanapun, Anda dapat memperbaiki peringatan ini dengan menghapus anotasi itu atau mengubahnya ke Exceptionkelas.

Menandai
sumber
Sebut saja suppressing, not fixing :) Saya kira, analisa statis menyoroti itu karena metode yang melempar IOException biasanya memblokir dan membutuhkan waktu yang berharga untuk menyelesaikannya.
Ivan Shafran
Saya menemukan penjelasan ini tentang IOException membantu: mendiskusikan.kotlinlang.org/t/…
Ivan Shafran