Как передать коллекцию Map из корутины?
Суть задачи в том что у меня есть класс (к которому обращаюсь из MainActivity раз в секунду, создавая много объектов), и там корутина которая создает и запускает движение ImageView, в корутине раз в 100 миллисекунд обновляются координаты этой передвигающейся ImageView (только по координате Y), до тех пор пока она не дойдет до края экрана, в формате mutableMap<Int, MutableList<Int>> //(index to listOf(x, y).
//В отдельном классе
var mapWithCoordinates = mutableMapOf<Int, MutableList<Int>>()
fun move(container: FrameLayout, index: Int) {
val object = draw(container, index) //Создаем объект
GlobalScope.async {
while (...//условие) {
mapWithCoordinates[index]?.removeLast() //Удаляем предыдущую координату Y
...//Перемещаем объект
mapWithCoordinates[index]?.add(y) //Обновляем координату Y в коллекции
delay(cellRate)
(container.context as Activity).runOnUiThread {
container.removeView(object)
container.addView(object)
}
}
if (...//Условие касания границы) ...//Удаляем из коллекции
(container.context as Activity).runOnUiThread {
container.removeView(object)
}
}
}
В двух словах создаются 5-6 объектов с присваиванием индекса, нужно отслеживать и сохранять их координаты, которые обновляются в постоянном режиме.
Как при каждом обновлении координат можно передать этот mutableMap в переменную в условно MainActivity (или в любое другое), чтобы можно было к нему обратиться?
(Или другой способ решения поставленной задачи)
Ответы (1 шт):
- ответ на ваш вопрос кроется в
LiveData. при работе корутина сетает данные вLiveData, а вы подписываетесь на ее обновления. GlobalScope- плохой выбор.async- тоже плохо. лучше использовать скоупы, которые привязаны к ЖЦ чего-нибудь, а вместоasync-launch.- лучше эту всю логику инкапсулировать во
ViewModel. там будут и работать корутина наviewModelScope, и изменятьсяLiveData.