如何用kotlin 1.1.0 kotlinx-coroutines-core lib的功能取代Anko的doAsync,uiThread?

ego*_*eev 5 android kotlin

我有一些代码,如:

doAsync{
...
uiThread{
...
}
}
Run Code Online (Sandbox Code Playgroud)

我如何用kotlinx-coroutines-core lib中的新东西替换doAsync和uiThread?

Rob*_*bin 11

协程库版本0.26的更新:

UI已重命名为Main.完整的工作示例为0.26:

async(CommonPool) {
    ...
    withContext(Main) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

您不需要从这里进一步阅读,我将其留给那些对此解决方案发展感兴趣的人.


coroutines库版本0.20的更新:

run现在已弃用,您应该使用withContext.0.20的完整工作示例:

async(CommonPool) {
    ...
    withContext(UI) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

自协同程序库更新到版本0.13后更新:

您现在可以compile 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.13'向gradle 添加依赖项以导入特定于android的UI协同程序上下文并使用它如下所示:

async(CommonPool) {
    ...
    run(UI) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

无需再定义自己的协程调度程序,正如下面原始答案时仍需要的那样.


原始答案:

它应该像这样工作:

async(CommonPool) {
    ...
    run(MainThread) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,现在,没有标准的实现MainThread可以让你回到Android上的主线程(虽然这将在未来的版本中出现!),所以你必须自己这样做,例如:

val MainThread = object : Executor {
    private val mHandler = Handler(Looper.getMainLooper())

    override fun execute(command: Runnable) {
        mHandler.post(command)
    }
}.toCoroutineDispatcher()
Run Code Online (Sandbox Code Playgroud)


x1a*_*1a4 9

问题中伪代码的确切替换是

GlobalScope.launch(Dispatchers.Default) {  // replaces doAsync
    ...
    launch(Dispatchers.Main) { // replaces uiThread
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)