android - 在资源方面,是否可以无限循环使用 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 来获取相对时间,或者每隔一秒进行一次字符串格式化,无论视图在屏幕上显示多长时间,我正在做的任何事情都是内存泄漏或高内存使用的潜在来源?
解决方案
您正在创建一个自定义CoroutineScope
. 这很好,但是您的工作是指出何时不再需要该范围,因此它会停止运行您的无限循环协程。现在,你似乎没有这样做。
更好的解决方案是使用CoroutineScope
绑定到 UI 的生命周期。由于您使用的是DialogFragment
,因此viewLifecycleScope
扩展属性 onFragment
将是一个可能的选择。然后,当片段被销毁时,您的协程将被清理。您可以直接使用该范围,或者您可能仍然创建自己的自定义范围,但viewLifecycleScope
作为父级,因此您可以控制单个计时器(如果不再需要它们,则取消它们),同时仍然获得生命周期意识。
推荐阅读
- c# - 单击删除按钮时如何防止DataTable中的Default?
- unity3d - 使用 Unity2D 创建一个类似于 Megaman 的角色选择屏幕
- python - 自定义 pytest 收集测试
- msvcrt - 在 Windows 7 嵌入式标准上安装 MSVC 可再发行组件
- javascript - 使用由 props 传递且不与给定事件关联的函数作为点击
- python - 在 pandas 的列中查找属于一起的元素
- testing - 更改加特林脚本中特殊字符的表示
- c# - INSERT 查询实际上没有插入任何数据
- reactjs - 如何检测由滑动触发的返回导航并在iOS上停止它?
- php - 尝试使用 Laravel 5.8 向我的 slack 发送通知时出错