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

4

1 回答 1

2

块中的线程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.

于 2019-01-11T08:01:03.003 回答