hawkkiller
@hawkkiller
Dart, Flutter, JS/TS, React Native, Vue3, NEST.JS,

Как сделать чтобы при закрытии фрагмента к нему перестали обращаться?

CoroutineScope(Dispatchers.IO).launch {
            while (true) {
                val msg = Message()
                msg.what = mediaPlayer.currentPosition
                handler.sendMessage(msg)
                delay(10)
            }
        }
    }


    @SuppressLint("HandlerLeak")
    var handler = object : Handler(Looper.getMainLooper()) {


        override fun handleMessage(msg: Message) {
            val currentPosition = msg.what

            // Update positionBar
            positionBar.progress = currentPosition

            // Update Labels
            val elapsedTime = createTimeLabel(currentPosition)
            elapsedTimeLabel.text = elapsedTime

            val remainingTime = createTimeLabel(totalTime - currentPosition)
            remainingTimeLabel.text = "-$remainingTime"
        }
    }


Вылетает с текстом positionBar must not be null, потому что происходит обращение к нему когда закрыт фрагмент уже. Как решить это? Думал дело в том, что я использовал Thread, а не Coroutines, но оказывается не в этом. Как решить? Спасибо.
  • Вопрос задан
  • 143 просмотра
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Омагад.
Читай про structured concurrency. Читай про жизненный цикл фрагментов.
Всё происходит из-за того, что ты неправильно обращаешься с ними. Из-за того, что ты поменял один инструмент на другой, неправильное обращение никуда не делось. Ты должен отменить скоуп при выходе с фрагмента(в onDestroyView). И обращаться в мейнтред через MainDispatcher, раз уж ты используешь корутины.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы