Как передать коллекцию 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 шт):

Автор решения: Wlad
  1. ответ на ваш вопрос кроется в LiveData. при работе корутина сетает данные в LiveData, а вы подписываетесь на ее обновления.
  2. GlobalScope - плохой выбор. async - тоже плохо. лучше использовать скоупы, которые привязаны к ЖЦ чего-нибудь, а вместо async - launch.
  3. лучше эту всю логику инкапсулировать во ViewModel. там будут и работать корутина на viewModelScope, и изменяться LiveData.
→ Ссылка