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 ;-)


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.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.