android - 从资源角度来看,使用 context.getString() 中的字符串无限循环刷新 TextView(每 n 秒)是否可以?

标签 android loops kotlin android-recyclerview kotlin-coroutines

所以,我有这个功能:

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/

相关文章:

android - Kotlin和Retrofit:如何处理HTTP 400响应?

inheritance - Kotlin:类继承了包含伴随对象的接口(interface),但无权访问接口(interface)的常量

缺少 AndroidManifest.xml 尝试重新导入插件

Kotlin 接口(interface)类型参数

android - 通过 RTMP 广播视频 - Android

Ruby 打破循环的问题

javascript - 从 for 循环中的函数返回值

SQL 根据前几行填空数据

java - onPostExecute() 中的 ArrayList 空指针异常

android - 使用 JAVA 8 进行 android 开发是一个好习惯吗?