所以,我有这个功能:
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 来获取相对时间,或者无论 View 处于打开状态多久,每隔一秒进行一次字符串格式化屏幕?
最佳答案
您正在创建一个自定义CoroutineScope
。这很好,但是您的工作就是指示何时不再需要该作用域,以便它停止运行您的无限循环协程。现在,您似乎没有这样做。
更好的解决方案是使用与 UI 生命周期相关的 CoroutineScope
。由于您使用的是 DialogFragment
,因此 Fragment
上的 viewLifecycleScope
扩展属性可能是一个选择。然后,当 fragment 被销毁时,你的协程将被清理。您可以直接使用该范围,也可以创建自己的自定义范围,但将 viewLifecycleScope
作为父级,这样您就可以控制各个计时器(如果不再需要,则取消它们),同时仍然可以获取生命周期意识。
关于android - 从资源角度来看,使用 context.getString() 中的字符串无限循环刷新 TextView(每 n 秒)是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62894997/