RunOnUiThread не запускается

Проблема

В android приложении у меня есть таймер и 2 значения которые я обновляю с помощью callback функции. Обычно всё работает, но через неопределённое время работы таймер останавливается, а значения перестают обновляться. В дэбаггере видно, что поток который я задаю строкой runOnUiThread просто не начинает выполнятся, но ошибку не выдаёт.

Код

Callback, который я задаю как свойство кастомной View в родительском фрагменте. В нём обновляется текст времени и текст счётчиков:

layout.gameView.updateCountCallBack = { eatCount, missedCount, time ->
            runOnUiThread {
                layout.missed_counter.text = missedCount.toString()
                layout.eaten_counter.text = eatCount.toString()
                layout.timer.text = time.toString()
                if (time<=0)
                    stop()
            }
        }

Свойства внутри View:

private var eaten_count = 0
        set(value) {
            field = value
            updateCountCallBack(eaten_count, missed_count, time)
        }
    private var missed_count = 0
        set(value) {
            field = value
            updateCountCallBack(eaten_count, missed_count, time)
        }
    private var time = 60
        set(value) {
            field = value
            updateCountCallBack(eaten_count, missed_count, time)
        }

    private val meals = mutableListOf<Meal>()
    private val monsters = mutableListOf<Monster>()
    private var counter_for_meal_generate = 0
    private var counter_for_monster_generate = 0

Таймер внутри View, который каждую секунду уменьшает время на 1 и вызывет callback'и при изменении свойств:


    val mTimer = timer(period = 40) {
        if (height == 0 || width == 0) return@timer
        counter_for_meal_generate += 40
        counter_for_monster_generate += 40

        (meals + monsters).forEach { creature -> creature.move() }
        val eaten = meals.filter { meal -> meal.isTouch(mx, my) }
        val missed = meals.filter { meal -> monsters.any { mnst -> meal.isTouch(mnst.x, mnst.y) } }

        eaten_count += eaten.size
        missed_count += missed.size

        meals.removeAll(missed + eaten)

        if (counter_for_meal_generate >= 400) {
            counter_for_meal_generate = 0

            meals.add(generateCreature(CreatureType.MEAL, width, height) as Meal)
            meals.removeAll { it.isOut(width, height) }
        }

        if (counter_for_monster_generate >= 1000) {
            time--
            counter_for_monster_generate = 0

            monsters.add(generateCreature(CreatureType.MONSTER, width, height) as Monster)
            monsters.removeAll { it.isOut(width, height) }
        }

        invalidate()
    }

Вопрос

Как понять из-за чего runOnUiThread не запускается? Что сделать чтобы всё работало без перебоев?


Ответы (0 шт):