android - Dispatchers.IO协程线程

标签 android kotlin kotlin-coroutines coroutine coroutinescope

我正在学习 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() 在方法)。 可能是什么原因? [我的错误]

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

最佳答案

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

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

关于android - Dispatchers.IO协程线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54142223/

相关文章:

android - 使用 Glide 4.11 时出现 "trying to use a recycled bitmap"崩溃,转换会导致此问题吗?

kotlin - Kotlin:在列表 “in parallel”上应用暂停功能?

android - 如何解决微调器内容隐藏的情况?

android - 插入数据库约束失败

android - AsyncTask 和进度条

android - 如何检测我是处于 Release模式还是 Debug模式?

java - 如何使用斯派克

android - 使用 Kotlin 协程替换 LocalBroadcastManager 以进行 Firebase 消息传递

android - 使用协程写入日志文件而不丢失日志的顺序

android - 抽象协程结构