首页 > 解决方案 > 标记自定义协程调度程序,使其被视为 Dispatchers.IO

问题描述

我正在使用一个简单的类将调度程序注入我的对象,因此我可以使用不同的调度程序进行测试和实际工作,我使用的类是:

interface IDispatchers {
    val IO: CoroutineDispatcher
    val CPU: CoroutineDispatcher
    val UI: CoroutineDispatcher
}

object AppDispatchers  : IDispatchers{
    override val UI = Dispatchers.Main
    override val CPU = Dispatchers.Default
    override val IO = Dispatchers.IO
}

@ExperimentalCoroutinesApi
object TestDispatchers : IDispatchers {
    override val IO = Dispatchers.Unconfined
    override val CPU = Dispatchers.Unconfined
    override val UI = Dispatchers.Unconfined
}

这很好用,完全符合我的要求。

我的问题是 android studio 的最新更新,当我有一个可能阻塞的操作(例如从流中读取)时,它无法理解我确实在使用 IO 调度程序并且它一直显示一条消息

例如,假设我有这个类:

class fooViewModel(val dispatchers:IDispatchers) {

    suspend fun thisDoesStuffOnIO() {
        //code
        val nextLine = withContext(dispatchers.IO) { stream.readLine() }

        //more code
    } 

}

现在当我dispatchers.IO用实际替换时Dispatchers.IO它没有显示警告,但是当我回到我的实现时它显示一个警告

我尝试在其中查找注释或属性Dispatchers.IO,如果复制到我的界面,将禁用检查,但我找不到任何

那么有没有办法让检查了解我正在使用的调度程序确实是一个 IO 调度程序并且没有实际问题?

标签: androidkotlin-coroutines

解决方案


推荐阅读