调度程序线程

时间:2019-01-11 07:40:37

标签: android kotlin coroutine kotlinx.coroutines

我正在用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

1 个答案:

答案 0 :(得分:1)

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