Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Dispatchers.IO协同程序线程_Android_Kotlin_Coroutine_Kotlinx.coroutines - Fatal编程技术网

Android Dispatchers.IO协同程序线程

Android Dispatchers.IO协同程序线程,android,kotlin,coroutine,kotlinx.coroutines,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) }

我正在学习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.saveapitonk(token)
将从单独的线程调用,但它在主线程上运行(Looper.myLooper()==Looper.getMainLooper()在方法内部返回true)。 原因可能是什么?[我的错误]


我正在使用Kotlin插件版本:1.3.11-release-Studio3.2-1和以下依赖项:kotlinx协程核心:1.0.1和kotlinx协程android: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()
    }
}
我们将看到线程[DefaultDispatcher-worker-1,5,main]。因此,该线程是背景线程。
正如@Marko Topolnik在评论中提到的,协同程序的主要目的是消除回调。请尝试重构您的代码并删除
callback:TaskCallback

什么
Thread.currentThread()
正在返回?它返回Thread[main,5,main],您能用context(Dispatchers.IO){Thread.currentThread()}检查一下这里的
线程吗
我刚刚测试了它,有一个不同的线程:
Thread[DefaultDispatcher-worker-1,5,main]
当您的自定义API再次具有
任务回调时,我不认为使用协同路由有什么意义。协同路由用于删除回调。您现在拥有的代码可以在没有它们的情况下以几乎相同的形式重写。