为什么我在RecyclerView中创建ViewHolder时嵌套类比内部类好

问题描述 投票:0回答:1

我听说内部类比 Kotlin 中的嵌套类使用更多内存。 有人说在 RecyclerView(ViewHolder)

 中使用内部类是不好的。

但是,如果没有内部类,很难使用 onClickListener 。

我无法完全理解为什么RecyclerView中的内部类会发生memory leak

并且必须使用嵌套类而不是内部类吗? 那么...内部类存在的原因是什么? 有人可以告诉我答案吗

我问了Chatgpt,但它只说内存泄漏...... 我想了解详细的动作!

android kotlin android-recyclerview android-viewholder anti-patterns
1个回答
0
投票
首先你需要知道

内部类和嵌套类的区别

  • 内部类:可以访问封闭类的成员(包括非静态成员)并捕获对封闭对象实例的引用。如果内部类实例和封闭对象超出了其预期范围,则可能会产生内存泄漏。
  • 嵌套类:不捕获对封闭对象的隐式引用,但只能访问封闭类的静态成员。这使得它们在内存泄漏方面更安全,但灵活性较差。
此外,您还需要了解 RecyclerView 中何时以及为何发生

内存泄漏

当你在RecyclerView的

ViewHolder

中使用内部类作为监听器时,
如果 
ViewHolder
 保留对其的引用,则会出现问题
内部类监听器。这样可以延长
ViewHolder
的使用寿命
超出其预期范围,即使 RecyclerView 将其从
视图层次结构。然后 
ViewHolder
 及其内部类监听器
让彼此在内存中存活,导致内存泄漏。

同样,您不必总是使用嵌套类,但是当您想要一个紧密连接的类而无需访问其非静态部分或为了防止内存问题时,它们会很方便。内部类的存在是因为它们有助于在类中组织相关函数,可以轻松访问非静态部分,并在某些情况下提供更大的灵活性。所以,这不是必须的,但它们带来了一些很酷的好处!

所以,根据你的情况,我可以建议你使用Lambda(我个人的意见)。请参阅下面的示例代码片段 -

class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) { val textView: TextView = view.findViewById(R.id.text_view) init { textView.setOnClickListener { position -> // Your click handler logic here with access to position } } }

Lamda 与匿名类类似,lambda 提供了一种简洁的方法来定义侦听器,而无需单独的类。这样可以提高代码可读性并避免内存泄漏。

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.