Можно ли с точки зрения ресурсов иметь бесконечный l oop refre sh TextView (каждые n секунд) со строкой из context.getString ()? - PullRequest
1 голос
/ 14 июля 2020

Итак, у меня есть эта функция:

inline fun runInLoop(intervalInMillis : Long = 1_000, crossinline function : suspend () -> Unit) {
    CoroutineScope(Dispatchers.Main).launch {
        while (true) {
            function.invoke()
            delay(intervalInMillis)
        }
    }
}

И я использую ее так:

Time.runInLoop(10_000L) {
    binding.timeCreatedTextView.text = mContext.getString(R.string.time_created, 
    Time.unixToRelativeTime(item.timeCreated))
}

В основном, я использую эту функцию для l oop каждую секунду, чтобы refre sh "timeCreatedTextView" с DateUtils.getRelativeTimeSpanString (), и это наиболее часто используется в строках RecyclerView, поэтому несколько бесконечных циклов будут выполняться в сопрограмме в фоновом режиме.

Мой вопрос: все, что я делаю, является потенциальным источником утечек памяти или большого количества использований памяти, поскольку я использую DateUtils для получения относительного времени или выполняю форматирование строк каждую секунду до тех пор, пока отображение отображается на экране?

1 Ответ

2 голосов
/ 14 июля 2020

Вы создаете кастом CoroutineScope. Это нормально, но тогда ваша задача - указать, когда эта область больше не нужна, чтобы она перестала запускать ваши сопрограммы infinite-l oop. Прямо сейчас вы, похоже, этого не делаете.

Лучшее решение - использовать CoroutineScope, привязанный к времени жизни вашего UI. Поскольку вы используете DialogFragment, свойство расширения viewLifecycleScope на Fragment будет наиболее вероятным выбором. Затем ваши сопрограммы будут очищены при уничтожении фрагмента. Вы можете использовать эту область напрямую или вы все равно можете создать свою собственную область действия, но с viewLifecycleScope в качестве родительского, чтобы вы могли управлять отдельными таймерами (отменяя их, если они больше не нужны), при этом сохраняя осведомленность о жизненном цикле.

...