Size: a a a

Kotlin Community

2020 February 28

AN

Alexander Nozik in Kotlin Community
Maxim Ternovtsi
Извиняюсь за немного оффтопа, но может вы знаете что делать если скопировал 50+ классов а импорты остались старые, можно кликнуть на package и изменить на правильную 50+ раз , но хочется, чтобы as все сама сделала
Replace in path
источник

MT

Maxim Ternovtsi in Kotlin Community
Вот спасибо 🤝
источник

MT

Maxim Ternovtsi in Kotlin Community
Сейчас бы 55 раз менял пакет
источник

K

Kopusha in Kotlin Community
если копировать из другого проекта/модуля, то идея вроде сама разруливает. А если извне то да... Еще можно сначала изменить свой пакет на пакет файлов, скопировать и потом переименовать обратно.
источник
2020 March 01

D

Danil Yudov in Kotlin Community
Наблюдаю весьма странное поведение при работе с каналами. Запускаю получение событий в отдельной корутине:

launch {
   for (event in channel) {
       try {
           println("получили $event")
           delay(1000)
           println("обработали $event)
       } catch (e: Exception) {
           println("ошибка обработки $event: $cause")
       }
   }
}

Отправляю несколько событий, делаю cancelChildren на родительском для launch контексте. При этом для кода как в примере выше канал продолжает получать события даже после отмены и ошибка об отмене корутины возникает только когда дело доходит до delay.
Но если убрать try-catch или delay то канал перестаёт получать события после отмены. Почему так?
источник

AN

Alexander Nozik in Kotlin Community
Danil Yudov
Наблюдаю весьма странное поведение при работе с каналами. Запускаю получение событий в отдельной корутине:

launch {
   for (event in channel) {
       try {
           println("получили $event")
           delay(1000)
           println("обработали $event)
       } catch (e: Exception) {
           println("ошибка обработки $event: $cause")
       }
   }
}

Отправляю несколько событий, делаю cancelChildren на родительском для launch контексте. При этом для кода как в примере выше канал продолжает получать события даже после отмены и ошибка об отмене корутины возникает только когда дело доходит до delay.
Но если убрать try-catch или delay то канал перестаёт получать события после отмены. Почему так?
В чем загадка-то? Отмена происходит только в suspension point при вызове библиотечных функций
источник

D

Danil Yudov in Kotlin Community
т.е. само получение события, которое тоже suspension point, не считается?
источник

AN

Alexander Nozik in Kotlin Community
Danil Yudov
т.е. само получение события, которое тоже suspension point, не считается?
А где там вызов функции?
источник

D

Danil Yudov in Kotlin Community
чёт у меня всё равно не укладывается вышеописанное поведение в голове 😐 не понимаю почему до "получение $event" доходит в том случае, но не доходит если убрать тот же try-catch (оставив delay)
источник

AN

Alexander Nozik in Kotlin Community
Danil Yudov
чёт у меня всё равно не укладывается вышеописанное поведение в голове 😐 не понимаю почему до "получение $event" доходит в том случае, но не доходит если убрать тот же try-catch (оставив delay)
наверное потому что launch падает
источник

AN

Alexander Nozik in Kotlin Community
а в нынешнем виде ошибка отлавливается и он не падает
источник

D

Danil Yudov in Kotlin Community
но получается, что ошибка отлавливается до её возникновения, если судить по варианту с try-catch
источник

D

Danil Yudov in Kotlin Community
или у меня уже голова кипит 🌚
источник

AN

Alexander Nozik in Kotlin Community
Danil Yudov
или у меня уже голова кипит 🌚
у меня точно кипит, я соображаю плохо к вечеру
источник

AO

Alexey Otts in Kotlin Community
Видимо for не проверяет isActive, а вот delay проверяет
источник

AN

Alexander Nozik in Kotlin Community
Alexey Otts
Видимо for не проверяет isActive, а вот delay проверяет
for вызывает просто итератор. А как там итератор работает, надо в код смотреть.
источник

AO

Alexey Otts in Kotlin Community
Alexander Nozik
for вызывает просто итератор. А как там итератор работает, надо в код смотреть.
Ну я же для простоты это так обозвал
источник

DV

Dmitriy Volkovskiy in Kotlin Community
Danil Yudov
чёт у меня всё равно не укладывается вышеописанное поведение в голове 😐 не понимаю почему до "получение $event" доходит в том случае, но не доходит если убрать тот же try-catch (оставив delay)
Нужно в catch блоке дописать: if (e is CancellationExcention) throw e
источник

D

Danil Yudov in Kotlin Community
Dmitriy Volkovskiy
Нужно в catch блоке дописать: if (e is CancellationExcention) throw e
да, спасибо, так поведение становится аналогичным другим вариантам
источник

K

KOSHERNO in Kotlin Community
источник