在后台线程中膨胀视图?

问题描述

我有一个 RecyclerView 包含可能非常复杂的视图,如果它们及时膨胀,它们的膨胀会使滚动不稳定。我的想法是我可以在后台线程中预膨胀视图。我已经试过了,它在模拟器和我的 Pixel 3 上都运行得非常好。需要明确的是,它们只是膨胀而不是提前添加到父级。

我找到了 this SO 线程,他们说三星 galaxy 手机似乎存在问题,但该线程已使用近 10 年,所以我不确定这是否仍然是一个问题。

谷歌当然说不要这样做。见here。尽管他们提到的原因(主要是内存泄漏)不适用于我的情况。或者至少我在这里没有看到可能的 Activity 泄漏。

这是我正在做的简化:

class MyRecyclerAdapter(
    private var items: List<Item>
) : RecyclerView.Adapter<MyViewHolder>() {

    // Map to hold the pre-cached views
    private val viewCache = mutableMapOf<Int,Deferred<View?>>()

    companion object {
        // Only inflate one view at a time
        val serialCoroutinedispatcher = Executors.newFixedThreadPool(1).asCoroutinedispatcher()
    }

    init {
        items.forEachIndexed { index,it ->
            viewCache[index] = Coroutinescope(serialCoroutinedispatcher).async {
                createViewForItem(it) // View is created asynchronously here
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int) =
        runBlocking {
            MyViewHolder(
                // If no view in cache,inflate here
                viewCache.remove(viewType)?.await() ?: createViewForItem(items[viewType])
            )
        }

    ...

有人试过类似的吗?或者有人可以告诉我为什么我不应该这样做(除了泄露 Activity 在这里不是问题)?

仅供参考:我知道 AsyncLayoutInflater,但由于其他原因我不能使用它。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...