Size: a a a

Kotlin Community

2020 August 01

AN

Alexander Nozik in Kotlin Community
Насколько я понимаю, проблема совсем не в rx а в lateinit.
источник

AI

Arkadii Ivanov in Kotlin Community
Alexander Nozik
Насколько я понимаю, проблема совсем не в rx а в lateinit.
И не в rx и не в lateinig
источник

AN

Alexander Nozik in Kotlin Community
На какой строчке падает?
источник

AI

Arkadii Ivanov in Kotlin Community
Alexander Nozik
На какой строчке падает?
Вот код, который я хочу оформить в YouTrack https://pastebin.com/PjLSc7Dc
источник

AI

Arkadii Ivanov in Kotlin Community
Там я добавил комментарий, где падает
источник

AI

Arkadii Ivanov in Kotlin Community
В моём понимании, т.к. Dispatchers.Main асинхронный, то flow.collect {} не должен быть вызван, если Job уже отменена с главного потока.
источник

AI

Arkadii Ivanov in Kotlin Community
Если использовать Main.immediate, то colect{} вызывается синхронно в стеке proxy.broadcast("text"), и тогда не падает.
источник

AN

Alexander Nozik in Kotlin Community
Без дебаггера понять, что оно у вас делает вообще не возможно. Очень запутанно. Но чисто идейно, я не вижу вообще никаких гарантий того, что коллектор flow вызывается в том время, когда приложение активно. Откуда это следует?
источник

AN

Alexander Nozik in Kotlin Community
Короче тут несколько мест с гонками данных. Если бы я был султан, я бы все переписал
источник

AI

Arkadii Ivanov in Kotlin Community
@noraltavir Я совершенно не понимаю, о каких гонках речь. Там нет многопоточности, всё работает на главном потоке. в onStart запускается корутина на Dispatchers.Main. В onStop выполняются два действия:
1. Отправляется сообщение в channelFlow
2. Вызывается job.cancel()

Как я это вижу. Корутина запущенная в onStart находится в состоянии suspended. Далее в канал отправляются данные. Далее корутина отменяется. И почему-то, корутина просыпаетя и получает данные из канала.

Я не знаю как ещё лучше объяснить.
источник

AN

Alexander Nozik in Kotlin Community
Arkadii Ivanov
@noraltavir Я совершенно не понимаю, о каких гонках речь. Там нет многопоточности, всё работает на главном потоке. в onStart запускается корутина на Dispatchers.Main. В onStop выполняются два действия:
1. Отправляется сообщение в channelFlow
2. Вызывается job.cancel()

Как я это вижу. Корутина запущенная в onStart находится в состоянии suspended. Далее в канал отправляются данные. Далее корутина отменяется. И почему-то, корутина просыпаетя и получает данные из канала.

Я не знаю как ещё лучше объяснить.
У вас гонка между закрытием джобы и получением сообщения. Нет гарантии того, что слушатель закроется ПОСЛЕ того, как приложение уйдет в фон.
источник

AN

Alexander Nozik in Kotlin Community
И это то, что я вижу на поверхности. Поток данных очень запутанный через все эти прокси
источник

AI

Arkadii Ivanov in Kotlin Community
Alexander Nozik
У вас гонка между закрытием джобы и получением сообщения. Нет гарантии того, что слушатель закроется ПОСЛЕ того, как приложение уйдет в фон.
источник

AI

Arkadii Ivanov in Kotlin Community
Скажите, если есть вот такой код, и я на главном потоке вызываю job.cancel. Разве нет гарантии что collect больше не должен вызываться ни при каких обстоятельствах?
источник

AN

Alexander Nozik in Kotlin Community
Arkadii Ivanov
Скажите, если есть вот такой код, и я на главном потоке вызываю job.cancel. Разве нет гарантии что collect больше не должен вызываться ни при каких обстоятельствах?
Нет конечно. Это и есть гонка
источник

AI

Arkadii Ivanov in Kotlin Community
У меня получается, что collect вызывается в следующем фрейме главного потока
источник

AN

Alexander Nozik in Kotlin Community
У вас две параллельные задачи, не известно, что выполнится быстрее - канал закроется или приложение
источник

AN

Alexander Nozik in Kotlin Community
То, что выполнена job.cancel - значит пошел сигнал на отмену, но не значит, что все мгновенно отменилось
источник

AN

Alexander Nozik in Kotlin Community
Если какая-то задача уже запущена, она доделается
источник

AI

Arkadii Ivanov in Kotlin Community
Да как же так? Если там стоит Main dispatcher и я на главном потоке отменяю корутину. Как так она может вызваться в следующем фрейме главного потока?
источник