以下のクラスがあります:
class Repository(
private val assetManager: AssetManager,
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) {
suspend fun fetchHeritagesList(): HeritageResponse = withContext(ioDispatcher) {
try {
// TODO Blocking method call?
val bufferReader = assetManager.open("heritages.json").bufferedReader()
...
open("heritages.json")
そして、なぜ警告が表示されるのか疑問に思いますInnapropriate blocking method call
。それは修正ではないのですかwithContext(ioDispatcher)
?
説明ありがとう!
ベストアンサー1
中断可能な関数内のブロッキング呼び出しを探す IntelliJ の検査は、Dispatchers.IO
と での使用の間の間接レベルを検査できるほど強力ではありませんwithContext
。以下は、この問題の最小限の再現例です。
class IoTest {
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
suspend fun indirectRef() = withContext(ioDispatcher) {
FileInputStream(File("dummy.txt")) // Flagged as inappropriate blocking call
}
suspend fun directRef() = withContext(Dispatchers.IO) {
FileInputStream(File("dummy.txt")) // Not flagged
}
}
しかし、私の場合とは異なり、あなたのはioDispatcher
コンストラクタを通じて注入されるので、Dispatchers.Main
代わりに簡単に提供することができ、だろう不適切なブロックとなります。
残念ながら、ディスパッチャの契約を「ブロッキング呼び出しを許容する」と正式に指定して、コンストラクターでそれを強制する方法はまだ聞いたことがありません。
同様の問題がすでに公開されていますユートラック。
編集:2022 年 3 月 16 日のビルド時点では、 内でも IO 呼び出しにフラグを立てる回帰が発生しているようですwithContext(IO)
。