Size: a a a

Kotlin Community

2020 August 02

d

double_b in Kotlin Community
Quantum Harmonizer
для заворачивания коллбэков в корутины используют suspendCoroutine. Можно для примера глянуть адаптеры к OkHttp.
ага, спасибо)) будем копать в эту сторону
источник

d

double_b in Kotlin Community
Quantum Harmonizer
для заворачивания коллбэков в корутины используют suspendCoroutine. Можно для примера глянуть адаптеры к OkHttp.
Благодарю еще раз - нашел хорошее пояснение на старандроид - получил, что хотел)
источник

CC

Constantine Cerberus in Kotlin Community
День добрый, хочу переехать с call back  на flow вот хотел поинтересоваться есть ли нюансы на которые нужно будет обратить внимание. Заранее спасибо.
источник

AN

Alexander Nozik in Kotlin Community
Constantine Cerberus
День добрый, хочу переехать с call back  на flow вот хотел поинтересоваться есть ли нюансы на которые нужно будет обратить внимание. Заранее спасибо.
Ну архитектура другая - это главный нюанс. Так берете пример из callbackFlow и вперед, но привыкать ко многому придется.
источник

CC

Constantine Cerberus in Kotlin Community
Alexander Nozik
Ну архитектура другая - это главный нюанс. Так берете пример из callbackFlow и вперед, но привыкать ко многому придется.
Ну то что архитектра другая это понятно, callbackFlow не подходит так как оборачивать не буду а изначально выпиливать call back полностью и заменять его на полноценный flow , тут больше вопросов по мулти поточность и гонки , я так понимаю что flow уже изначально синхронизирован, и emit будет на уровне класса а не функции .
источник

AN

Alexander Nozik in Kotlin Community
Constantine Cerberus
Ну то что архитектра другая это понятно, callbackFlow не подходит так как оборачивать не буду а изначально выпиливать call back полностью и заменять его на полноценный flow , тут больше вопросов по мулти поточность и гонки , я так понимаю что flow уже изначально синхронизирован, и emit будет на уровне класса а не функции .
Нет, не совсем. Корутины ортогональны многопоточности. Если у вас все сделано в корутинах и нету гонок в дизайне, то скорее всего все будет работать как надо. Проблемы будут если у вас там какое-то изменяемое глобальное состояние и вы пытаетесь полагаться на то, как корутины о потоком размещаются как во вчерашней дискуссии.
источник

AN

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

CC

Constantine Cerberus in Kotlin Community
Alexander Nozik
Нет, не совсем. Корутины ортогональны многопоточности. Если у вас все сделано в корутинах и нету гонок в дизайне, то скорее всего все будет работать как надо. Проблемы будут если у вас там какое-то изменяемое глобальное состояние и вы пытаетесь полагаться на то, как корутины о потоком размещаются как во вчерашней дискуссии.
Усе сделано в корутинах окутано ими😁 я больше не вернусь к тредам если уж сильно не прижмёт ну или не потребуется решение на джаве а там и rx в помощь , если ничего не на косячио то должны выполняться без гонки .
источник

AN

Alexander Nozik in Kotlin Community
Constantine Cerberus
Усе сделано в корутинах окутано ими😁 я больше не вернусь к тредам если уж сильно не прижмёт ну или не потребуется решение на джаве а там и rx в помощь , если ничего не на косячио то должны выполняться без гонки .
Ну тогда все хорошо и про гонки думать не надо.
источник

CC

Constantine Cerberus in Kotlin Community
Alexander Nozik
Корутины гарантируют порядок выполнения только внутри одной корутины. Если работать с ними как с потоками, могут быть сюрпризы. К классам и функциям там ничего не привязано.
Ну я собираюсь сделать так чтобы класс наследовал интерфейс flow и уже внутри emit ивентов во  внешюю среду через инстанс данного класса на сколько такой подход кошерный .
источник

AN

Alexander Nozik in Kotlin Community
Основная деталь, на которую следует обратить внимание - это подписки и отмена. Можно сделать разные варианты. Например Flow, которые может собирать несколько потребителей одновременно, как это работает со StateFlow/
источник

AN

Alexander Nozik in Kotlin Community
Constantine Cerberus
Ну я собираюсь сделать так чтобы класс наследовал интерфейс flow и уже внутри emit ивентов во  внешюю среду через инстанс данного класса на сколько такой подход кошерный .
Кроме крайней необходимости так делать не рекомендуется, лучше сделайте у своего класса функцию flow() и возвращаете там какой-то штатный объект.
источник

CC

Constantine Cerberus in Kotlin Community
Alexander Nozik
Кроме крайней необходимости так делать не рекомендуется, лучше сделайте у своего класса функцию flow() и возвращаете там какой-то штатный объект.
А можно узнать почему не рекомендуется? Просто из за того что ивенты будут происхоть в разные моменты и ну так например поток данных которые нужно будет разбить по пакетам и emit каждого пакета отдельно в процессе поступления .
источник

AN

Alexander Nozik in Kotlin Community
Constantine Cerberus
А можно узнать почему не рекомендуется? Просто из за того что ивенты будут происхоть в разные моменты и ну так например поток данных которые нужно будет разбить по пакетам и emit каждого пакета отдельно в процессе поступления .
Потому что ваша собственная реализация коллекта будет почти наверняка с проблемами. Там не так много нюансов при использовании, но очень много в реализации.
То, что вы хотите делается путем комбинации канала и flow, делаете внутри класса приватный канал с нужной емкостью и пихаете новые события туда, а во вне может торчать fun flow() = channel.recieveAsFlow() или consumeAsFlow в зависимости от того, что вам нужно.
источник

CC

Constantine Cerberus in Kotlin Community
Alexander Nozik
Потому что ваша собственная реализация коллекта будет почти наверняка с проблемами. Там не так много нюансов при использовании, но очень много в реализации.
То, что вы хотите делается путем комбинации канала и flow, делаете внутри класса приватный канал с нужной емкостью и пихаете новые события туда, а во вне может торчать fun flow() = channel.recieveAsFlow() или consumeAsFlow в зависимости от того, что вам нужно.
Я не планировал  коллектора самому реализовать , а именно Flow<T> хотел имплементировать

Class CustomFlow: Flow<T>
override fun collect(collector: Flow collector<T>)

Через функцию получить collector

А потом через него делать collector.emit(T)
источник

AN

Alexander Nozik in Kotlin Community
Constantine Cerberus
Я не планировал  коллектора самому реализовать , а именно Flow<T> хотел имплементировать

Class CustomFlow: Flow<T>
override fun collect(collector: Flow collector<T>)

Через функцию получить collector

А потом через него делать collector.emit(T)
Надо реализовывать метод collect и там начнутся сложости с пониманием того, откуда берется контекст, как будет себя вести Flow без подписчиков, и так далее. Это можно все делать только если вы очень хорошо понимаете, что происходит.
источник

AN

Alexander Nozik in Kotlin Community
Ну и помните о
источник

CC

Constantine Cerberus in Kotlin Community
Alexander Nozik
Ну и помните о
Ну в таком случае лучше остаться на с callback  и обернуть их в callback Flow
источник

AN

Alexander Nozik in Kotlin Community
Constantine Cerberus
Ну в таком случае лучше остаться на с callback  и обернуть их в callback Flow
Ну callbackFlow - это по сути и есть канал + flow. Но вариант вполне хороший, если он вам подходит
источник

CC

Constantine Cerberus in Kotlin Community
Alexander Nozik
Надо реализовывать метод collect и там начнутся сложости с пониманием того, откуда берется контекст, как будет себя вести Flow без подписчиков, и так далее. Это можно все делать только если вы очень хорошо понимаете, что происходит.
Не совсем понял зачем нужно реализовать collector так как можно его просто в локальную переменную всунуть и использовать напрямую тестил вроде все работает как и должно.
источник