Dispatchers.IO协程的线程

3

我正在学习Android中的协程。我有以下代码:

private val scope = CoroutineScope(Dispatchers.Main + job)

operator fun invoke(token: String, callback: TaskCallback) {
    scope.launch {
        withContext(Dispatchers.IO) { userDataSource.saveApiToken(token) }
        callback.onCompleted()
    }
}

我原本期望userDataSource.saveApiToken(token)会在单独的线程中运行,但它在主线程上运行(方法内的Looper.myLooper() == Looper.getMainLooper()返回 true)。 可能是什么原因?【我的错误】

我正在使用Kotlin插件版本:1.3.11-release-Studio3.2-1 和以下依赖项:kotlinx-coroutines-core:1.0.1和kotlinx-coroutines-android:1.0.1


Thread.currentThread() 返回的是什么? - Sergio
1
它返回 Thread[main,5,main] - Derek K
请问您能否检查一下这里的线程 withContext(Dispatchers.IO) { Thread.currentThread() } - Sergio
2
我刚刚测试了一下,发现有一个不同的线程:Thread[DefaultDispatcher-worker-1,5,main] - Sergio
好的,我的错误,它返回Thread [DefaultDispatcher-worker-2,5,main]。谢谢。 - Derek K
4
当你的自定义API再次具有“TaskCallback”时,我不明白使用协程的意义。协程的存在是为了消除回调函数。你现在拥有的代码可以几乎以相同的形式重写而不需要协程。 - Marko Topolnik
1个回答

3

withContext(Dispatchers.IO)块中的线程应该是后台线程。如果我们在那里放置日志:

operator fun invoke(token: String, callback: TaskCallback) {
    scope.launch {
        withContext(Dispatchers.IO) { Log.e("Log", "t: ${Thread.currentThread()}") }
        callback.onCompleted()
    }
}

我们将看到Thread [DefaultDispatcher-worker-1,5,main]。因此,该线程是一个后台线程。 正如@Marko Topolnik在评论中提到的那样,协程的主要目的是摆脱回调函数。请尝试重构代码并删除callback: TaskCallback


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接