Size: a a a

Kotlin Community

2020 April 08

PS

Pavel Shilyagov in Kotlin Community
(
Знаете, кто так умеет? Тайпклассы
Все так. Именно поэтому в том же c# решили сразу добавить тайпклассы вместо "обрезанных" фич типа "констрейнт на конструкторы с параметрами".
источник

AN

Alexander Nozik in Kotlin Community
Nikita Yatskivskiy
То есть, надо всегда закрывать канал, если мы его создали через openSubscription()? Чтобы утечек не было. Недостаточно закрыть скоуп.
Что-то не до конца понимаю ((
У вас два разных скоупа. Скоуп создателя и потребителя. Для того, чтобы канал закрылся надо закрывать скоуп создателя или сам канал
источник

NY

Nikita Yatskivskiy in Kotlin Community
Alexander Nozik
У вас два разных скоупа. Скоуп создателя и потребителя. Для того, чтобы канал закрылся надо закрывать скоуп создателя или сам канал
Канал потребителя - это как раз ReceiveChannel же?)

Если так, то при отписке канал потребителя закроется?
Создатель должен жить. Меня как раз потребитель и интересует.
источник

AN

Alexander Nozik in Kotlin Community
Nikita Yatskivskiy
Канал потребителя - это как раз ReceiveChannel же?)

Если так, то при отписке канал потребителя закроется?
Создатель должен жить. Меня как раз потребитель и интересует.
Потребитель надо руками закрывать, разумеется.
источник

AN

Alexander Nozik in Kotlin Community
В доке черным по по белому написано.
источник

VP

Vladimir Petrakovich in Kotlin Community
Nikita Yatskivskiy
> Если канал в скоупе

Имеет виду, если я consumeEach или onReceive у канала вызвал в каком-то скоупе?

private val someChannel = BroadcastChannel<String>(1)

someScope.launch {
  someChannel.openSubscription().consumeEach { print(it) }
}

someScope.cancel()
consumeEach закрывает (cancel) канал при выходе
источник

NY

Nikita Yatskivskiy in Kotlin Community
Vladimir Petrakovich
consumeEach закрывает (cancel) канал при выходе
Под выходом имеете ввиду закрытие скоупа?
источник

VP

Vladimir Petrakovich in Kotlin Community
Nikita Yatskivskiy
Под выходом имеете ввиду закрытие скоупа?
Под выходом я имею в виду возврат из функции consumeEach каким-либо образом
источник

AN

Alexander Nozik in Kotlin Community
Nikita Yatskivskiy
Под выходом имеете ввиду закрытие скоупа?
когда все вычитано
источник

VP

Vladimir Petrakovich in Kotlin Community
Alexander Nozik
когда все вычитано
Ну можно кинуть исключение, не вычитывая всё
источник

VP

Vladimir Petrakovich in Kotlin Community
А скоупы тут вообще никаким боком
источник

AN

Alexander Nozik in Kotlin Community
Vladimir Petrakovich
Ну можно кинуть исключение, не вычитывая всё
Так себе. Про скоупы согласен.
источник

VP

Vladimir Petrakovich in Kotlin Community
Alexander Nozik
Так себе. Про скоупы согласен.
Ну я к тому, что если оно вылетит, канал закроется
источник

AN

Alexander Nozik in Kotlin Community
Vladimir Petrakovich
Ну я к тому, что если оно вылетит, канал закроется
Вероятно. Там скорее всего try-catch стоит
источник

VP

Vladimir Petrakovich in Kotlin Community
Alexander Nozik
Вероятно. Там скорее всего try-catch стоит
Инфа 100%, надо только глянуть в доку 😏
источник

AN

Alexander Nozik in Kotlin Community
лееень
источник

NY

Nikita Yatskivskiy in Kotlin Community
Ребят, тогда такой вопрос - есть какая-либо возможность слушать закрытие скоупа? И, например, по его закрытию кенселить тот же канал? Вроде не нашёл никаких коллбэков ни у него, ни у контекста((
источник

VP

Vladimir Petrakovich in Kotlin Community
Nikita Yatskivskiy
Ребят, тогда такой вопрос - есть какая-либо возможность слушать закрытие скоупа? И, например, по его закрытию кенселить тот же канал? Вроде не нашёл никаких коллбэков ни у него, ни у контекста((
try-finally обычно хватает
источник

AN

Alexander Nozik in Kotlin Community
Nikita Yatskivskiy
Ребят, тогда такой вопрос - есть какая-либо возможность слушать закрытие скоупа? И, например, по его закрытию кенселить тот же канал? Вроде не нашёл никаких коллбэков ни у него, ни у контекста((
coroutineContex[Job].invokeOnCompletion, но лучше такого избегать
источник

AN

Alexander Nozik in Kotlin Community
try лучше
источник