правильный способ использования сопрограмм в kotlin 1.3 - PullRequest
0 голосов
/ 24 ноября 2018

Я начал использовать коротуины, когда они еще были в экспериментеС anko у меня было что-то вроде

async(UI) {
    val request = bg { sendRequest() }
    val result = request.await()
    // UI work
}

Мне действительно нравится, как он структурирован, и он действительно обеспечивает более чистый код по сравнению с адом обратного вызова.Я только что понял, что сопрограммы сейчас в стабильном канале, и не мог дождаться, чтобы попробовать это.Я обновил свои kotlin и anko, и теперь у меня есть это

doAsync {
    val result = sendRequest()
    uiThread {
        // ui work
    }
}

Я делаю это правильно?Эта структура кажется мне безобразной.Хотя это может быть более читабельным, но мне все еще нравится старый способ вызова await().А может я что-то здесь скучаю?Я помню один из пунктов продажи, когда был введен coroutines - это менее фигурные скобки.

1 Ответ

0 голосов
/ 24 ноября 2018

Вам не нужен Анко, чтобы получить хороший код с сопрограммами.Кроме того, вам не нужно async, и на самом деле вам следует избегать его в таких случаях, как ваш, когда вы просто хотите совершить неблокирующий вызов и не хотите запускать несколько таких вызовов одновременно.Ваша основная идиома должна быть

myScope.launch {
    val result = sendRequest()
    // UI work
}

, где sendRequest() - это

suspend fun sendRequest() = withContext(Dispatchers.IO) { ... body ... }

Если вы звоните с Android Activity, тогда myScope может быть просто неявным this, и ваша деятельность должна реализовывать CoroutineScope:

class MyActivity : AppCompatActivity, CoroutineScope {
    override val coroutineContext = SupervisorJob() + Dispatchers.Main
    ...
}

Чтобы получить больше информации, настоятельно рекомендуется прочитать 1011 * Явный параллелизм Романа Елизарова.

...