Мне нужно перенести экспериментальные функции Kotlin Corotine на стабильную версию - PullRequest
0 голосов
/ 25 января 2020

Я хочу перенести существующее приложение Android в последний выпуск сопрограмм. Кто-нибудь там, чтобы помочь переписать эти функции Котлайн-сопрограммы. Мне нужны эти функции launchAsyn c asyn c и функции asyncAwait в точности так, как они описаны здесь в моей модели представления.

package com.xx.xxx.xxxx.

import kotlinx.coroutines.experimental.CommonPool
import kotlinx.coroutines.experimental.CoroutineScope
import kotlinx.coroutines.experimental.Deferred
import kotlinx.coroutines.experimental.Job
import kotlinx.coroutines.experimental.android.UI
import kotlinx.coroutines.experimental.async
import kotlinx.coroutines.experimental.launch

fun launchAsync(block: suspend CoroutineScope.() -> Unit): Job {
    return launch(UI) { block() }
}

suspend fun <T> async(block: suspend CoroutineScope.() -> T): Deferred<T> {
    return async(CommonPool) { block() }
}

suspend fun <T> asyncAwait(block: suspend CoroutineScope.() -> T): T {
    return async(block).await()
}

Спасибо

Ответы [ 2 ]

1 голос
/ 25 января 2020

Это буквальные переводы:

launch(UI) { block() } -> GlobalScope.launch(Main, block = block)

async(CommonPool) { block() } -> GlobalScope.async(block = block). Кроме того, ваша функция помечена как suspend без причины.

async(block).await() -> withContext(Default, block = block)

Однако в стабильных сопрограммах появилась очень важная дополнительная функция: структурированный параллелизм. Вы не должны использовать GlobalScope, как показано, но должны определять правильные области видимости и использовать их.

0 голосов
/ 02 февраля 2020

Вот код, который я сейчас использую. С помощью @ Marko, обмена для использования другими.

fun launchAsync(block: suspend CoroutineScope.() -> Unit): Job {
    return GlobalScope.launch(Dispatchers.Main) { block() }
}

suspend fun <T> async(block: suspend CoroutineScope.() -> T): Deferred<T> {
    return GlobalScope.async(Dispatchers.Default) { block() }
}

suspend fun <T> asyncAwait(block: suspend CoroutineScope.() -> T): T {
    return async(block).await()
}

Какие-нибудь дополнения? Marko

...