Проверка IntelliJ, которая ищет блокировку вызовов внутри приостанавливаемых функций, недостаточно мощна, чтобы увидеть уровень косвенности между Dispatchers.IO
и его использованием в withContext
. Вот минимальный источник проблемы:
class IoTest {
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
suspend fun indirectRef() = withContext(ioDispatcher) {
Thread.sleep(1) // Flagged as inappropriate blocking call
}
suspend fun directRef() = withContext(Dispatchers.IO) {
Thread.sleep(1) // Not flagged
}
}
Однако, в отличие от моего случая, ваш ioDispatcher
открыт для инъекции через конструктор, так что вы можете просто поставить Dispatchers.Main
вместо него и что будет представлять собой неуместную блокировку.
К сожалению, я еще не слышал о каком-либо способе формального определения контракта диспетчера как "допускающего блокировку вызовов", чтобы вы могли принудительно применить его в конструктор.
Уже есть похожая проблема, открытая на YouTrack .