Правильно вопрос задайте, если есть код, то с примером, так непонятно что спрашиваете. Зачем вообще ждать 3 коллбэка для выполнения 4, это многопоточность?
Пользователь нажал кнопку, загрузились данные, завершилась инициализация аналитики. Неизвестно в каком порядке это произойдет, но 4тый блок нужно выполнить только тогда когда завершены все 3 предыдущие. Вроде хорошо объяснил
Что используете для управления многопоточностью? RX, корутины, трэд пулл?
Ну а мы тут угадать должны. У корутин есть вызов через launch, а есть async, читайте теорию как это организовать, прям на сайте котлина можно читать
ни лаунч ни асинк не вернет результат с нажатия кнопки и завершения инициализации аналитики (аналитика колбек отдает)
Во, ещё какая - то аналитика. Не, сорри, я тут не помощник
Ну так я и написал 3 события, которые я жду: нажатие кнопки, колбек с аналитики, завершение загрузки. Прочитайте пожалуйста сообщение с которым я пришел, а не возмущайтесь на пустом месте
Вот тут ждут нескольких корутин: https://www.baeldung.com/kotlin/coroutines-waiting-for-multiple-threads
А как в них ждать инициализацию аналитики и нажатие кнопки? Ладно можно предположить, что аналитика статичная и на мейн диспатчере её ждать, но как с кнопкой?
Как вариант - ставить флаги, проверять их всех где-то в одном месте. Кто ж его знает, как там у вас всё организовано...
button.setOnClickListener { }
Ну вот я собственно и пришел за возможно каким-то паттерном или подходом. То, что как-то так-то того-то я и сам знаю же, хотелось бы что-то конкретное
С флагами будет проблема потому как могут сработать сразу 2 флага и тогда никогда 3 не сработают
Вы не это ищите ?) Не андройд, но все же ) https://metanit.com/kotlin/tutorial/8.2.php coroutineScope 😁
Нет, я ищу не это
Можно вот еще как извратиться. Каждое завершенное действие увеличивает некий счетчик от 0 до N. Некий код ждет, когда счетчик достигнет нужного значения, чтобы продолжить. Т.е., если нужно ждать 3 события, значит нужно дождаться, когда счетчик будет равен 3.
Ну, тоже можно, но тогда наверное нужно, чтобы счетчик был атомарный а то мало ли с какого потока его будут увеличивать. Окей, попробую такое, спасибо
Естественно, счетчик должен быть синхронизирован. В вашем случае неудобно то, что события происходят совершенно по-разному, а собрать их нужно в единое целое.
https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.sync/-semaphore/index.html
Мне же нужно не только счетчик но и реактивно на него реагировать
Например, сделать в vm метод updateProgress и звать его откуда надо при завершении задачи. А это метод у себя внутри при выполнении нужного условия дёрнет LiveData или Flow какое-нибудь. Подписчик получит уведомление, все радуются.
suspendCoroutine
Нажатие кнопки как я в ней ждать буду?
я делаю так, у тебя есть два события, которые ты хочешь дождаться, и после их свершения сделать что-то. создай две джобы (просто Job() в поля глобальные), назови их соответствующе, запусти где-нибудь корутину и в ней заджойнись к этим двум джобам (типа btnClickJob.join()), и после них код того действия заветного. при клике на кнопку btnClickJob.complete(), после инициализации аналитики analInitJob.complete(). готово
Обсуждают сегодня