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

时间:2017-03-06 14:49:44

标签: android kotlin

我有一些代码:

doAsync{
...
uiThread{
...
}
}

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

4 个答案:

答案 0 :(得分:11)

coroutines库版本0.26的更新:

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

async(CommonPool) {
    ...
    withContext(Main) {
        ...
    }
}

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

coroutines库版本0.20的更新:

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

async(CommonPool) {
    ...
    withContext(UI) {
        ...
    }
}

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

现在,您可以在{grampine}上添加对compile 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.13'的依赖项,以导入特定于Android的UI协同程序上下文并使用它:

async(CommonPool) {
    ...
    run(UI) {
        ...
    }
}

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

原始回答:

它应该像这样工作:

async(CommonPool) {
    ...
    run(MainThread) {
        ...
    }
}

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

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

    override fun execute(command: Runnable) {
        mHandler.post(command)
    }
}.toCoroutineDispatcher()

答案 1 :(得分:3)

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

GlobalScope.launch(Dispatchers.Default) {  // replaces doAsync
    ...
    launch(Dispatchers.Main) { // replaces uiThread
        ...
    }
}

答案 2 :(得分:0)

Kotlin 1.3协程退出实验状态的情况下,这就是我将Anko代码与协程交换的方式:

GlobalScope.launch(Dispatchers.Main) {
    for ((index, test) in tests.withIndex()) {
        try {
            ...

            async(Dispatchers.IO) {
                OkHttpClient().newCall(test.request).execute()
                ...
            }
            ...
        } catch (e: Exception) {
            ...
        }
    }
}

答案 3 :(得分:0)

协程库版本1.3.7:

GlobalScope.async(Dispatchers.Default) {
            // do background work
            withContext(Main) {
                // do ui work
            }
        }