首页 > 解决方案 > 在资源方面,是否可以无限循环使用 context.getString() 中的字符串刷新 TextView(每 n 秒)?

问题描述

所以,我有这个功能:

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))
}

基本上,我使用此函数每隔一秒循环一次,以使用 DateUtils.getRelativeTimeSpanString() 刷新“timeCreatedTextView”,这在 RecyclerView 行中使用最多,因此多个无限循环将在后台的协程上运行。

我的问题是,由于我使用 DateUtils 来获取相对时间,或者每隔一秒进行一次字符串格式化,无论视图在屏幕上显示多长时间,我正在做的任何事情都是内存泄漏或高内存使用的潜在来源?

标签: androidloopskotlinandroid-recyclerviewkotlin-coroutines

解决方案


您正在创建一个自定义CoroutineScope. 这很好,但是您的工作是指出何时不再需要该范围,因此它会停止运行您的无限循环协程。现在,你似乎没有这样做。

更好的解决方案是使用CoroutineScope绑定到 UI 的生命周期。由于您使用的是DialogFragment,因此viewLifecycleScope扩展属性 onFragment将是一个可能的选择。然后,当片段被销毁时,您的协程将被清理。您可以直接使用该范围,或者您可能仍然创建自己的自定义范围,但viewLifecycleScope作为父级,因此您可以控制单个计时器(如果不再需要它们,则取消它们),同时仍然获得生命周期意识。


推荐阅读