Разница между Иовом и Отложенным в сопрограммах Котлин - PullRequest
0 голосов
/ 22 ноября 2018

Я новичок в сопрограммах, я понимаю запуск и асинхронность, но все еще запутанная часть откладывается.Что отсрочено?и отличается между работой и отсрочкой. Ясное объяснение и пример более полезны.Заранее спасибо

Ответы [ 2 ]

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

На базовом уровне Deferred - это будущее.Это позволяет одному сопрограмму ждать результата, полученного другим, приостанавливая себя, пока не будет готов.Вызов async - это один, но далеко не единственный способ получить Deferred.

Однако я думаю, что ваш вопрос больше касается основ: когда использовать launch, когдаиспользуйте async-await.Вот важный урок: вам, вероятно, не нужен асинхронный .Люди склонны использовать его, потому что ключевые слова async и await знакомы с другими языками, но в Kotlin async не является универсальным инструментом для достижения неблокирующих вызовов.

ВотОсновной рецепт того, как превратить блокирующий вызов в приостановляющий, неблокирующий:

uiScope.launch {
    val ioResult = withContext(Dispatchers.IO) { blockingIOCall() }
    ... just use the result, you're on the GUI thread here.
}
0 голосов
/ 22 ноября 2018

Таким образом, job является своего рода объектом, который представляет выполнение сопрограммы и связан с структурированным параллелизмом , например, вы можете отменить задание, и все дочерние элементы этого задания также будут отменены.

Из документов :

Работа - это вещь, которую можно отменить, жизненный цикл которой завершается.

Deferred - это своего рода аналог Future в Java: инкапсулирует операцию, которая будет завершена в какой-то момент в будущем после ее инициализации.Но также относится к сопрограммам в Kotlin.

Из документации:

Отложенное значение - неблокируемое отменяемое будущее - это Задание, которое имеет результат.

Итак, Deferred - это Job, который имеет результат:

A deferred Значение равно Job.job в coroutineContext из async представляет собой сам сопрограмму.

Пример:

someScope.launch {
    val userJob: Deferred<User> = async(IO) { repository.getUser(id) }
    //some operations, while user is being retrieved 
    val user = userJob.await() //here coroutine will be suspended for a while, and the method `await` is available only from `Deferred` interface
    //do the job with retrieved user
}

Кроме того, можно структурировать это async запрос с существующей областью, но это разговор о другом вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...