Когда использовать ключевое слово Kotlin suspend? - PullRequest
0 голосов
/ 06 февраля 2019
fun startAsyncFunc() {
  launch {
    asyncFunc1()
    asyncFunc2()
  }
}

fun asyncFunc1() { ... }
suspend fun asyncFunc2() { ... }

Я могу закончить работу без suspend, и это даже облегчает тестирование (его можно протестировать без добавления runBlocking.

Мои вопросы:

  1. asyncFunc1 против asyncFunc2, что лучше и почему?
  2. Если asyncFunc2 лучше, я должен всегда использовать suspend всякий раз, когда функция будет запущена в сопрограммах?

Обновление

В последних выпусках Kotlin Coroutines я замечаю, что если метод не содержит кода сопрограмм (например, launch, async и т. Д.), Компилятор жалуется This inspection reports a suspend modifier as redundant if no other suspend functions are called inside.Поэтому я предполагаю, что suspend следует использовать только тогда, когда это необходимо.

Ответы [ 4 ]

0 голосов
/ 06 февраля 2019

Вы должны объявлять вашу функцию suspend только если это необходимо.Я бы сказал, что если вы сомневаетесь, если компилятор не заставляет вас, не используйте suspend.

В большинстве случаев, если у вас есть веская причина для приостановки функции, онозначает, что он делает что-то, что, вероятно, требует от вас использования таких функций приостановки, как withContext, и это заставит вас объявить вашу функцию suspend.

Обратите внимание, что объявление функции suspend не позволяет вашим абонентамделать что-то большее, чем они могли, когда ваша функция не была приостановлена.Во всяком случае, вы ограничиваете использование своей функции.

Я полагаю, что один из вариантов использования функции для приостановки без принуждения - это когда вы действительно абсолютно положительно хотите показать миру, что ваша функция вычислительнотяжелый, и, таким образом, вынудите ваших абонентов справиться с подвеской.

0 голосов
/ 06 февраля 2019

suspend ключевое слово означает, что сопрограмма может быть приостановлена ​​для последующего выполнения.

Сказав это, вы должны сознательно использовать их для сопрограмм, которые будут приостановлены (например, ваш asyncFunc2() сделал HTTP-вызов и ожидает ответа для его обработки)

Итак.

  1. Используйте suspend для функций, которые будут каким-либо образом задерживаться (в ожидании некоторых вычислений, ответа API и т. Д.)
  2. suspend fun можно запустить только из сопрограммы.Таким образом, если он будет приостановлен, он заблокирует сопрограмму.Уберите ключевое слово suspend, но запустите его в сопрограмме, и оно будет иметь тот же эффект.Однако, если вы запустите эту функцию извне сопрограммы, она заблокирует поток, в котором она выполнялась.

При тестировании сопрограмм всегда следует вызывать runBlocking.Если вы этого не сделаете, сопрограмма, которая будет приостановлена, может не завершиться, что приведет к провалу теста.

0 голосов
/ 06 февраля 2019
  1. Это зависит.Посмотрите комбинацию двух других ответов в это время: эффект вызова любой функции из сопрограммы идентичен.Однако с ключевым словом suspend сама функция может вызывать другие функции приостановки.Использование ключевого слова может указывать на некоторую работу, которая требует времени и, следовательно, может потребовать приостановки вызывающей сопрограммы.
  2. Функция, которая всегда будет вызываться из сопрограммы, не обязательно должна всегда иметь ключевое слово suspend,Это ключевое слово требуется только по причинам, указанным в разделе 1. Верно обратное: верная функция может вызываться только из сопрограммы.
0 голосов
/ 06 февраля 2019

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

Функции приостановки могут использоваться внутри сопрограмм так же, как обычные функции, но их дополнительная функция заключается в том, что они, в свою очередь, могут использовать другие функции приостановкикак и задержка в этом примере, чтобы приостановить выполнение сопрограммы.

...