Android と Kotlin のコルーチン: 不適切なブロッキング メソッド呼び出し 質問する

Android と Kotlin のコルーチン: 不適切なブロッキング メソッド呼び出し 質問する

以下のクラスがあります:

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)

おすすめ記事