我有一些代码:
doAsync{
...
uiThread{
...
}
}
如何用kotlinx-coroutines-core lib中的新东西替换doAsync和uiThread?
答案 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
}
}