【问题标题】:Does one need to free the viewhinding in the RecyclerView's ViewHolder to avoid memory leaks?是否需要释放 RecyclerView 的 ViewHolder 中的视图以避免内存泄漏?
【发布时间】:2022-08-03 07:36:27
【问题描述】:

在 Google 提供的 ViewBinding 示例中,我们需要将 Fragment 的 viewBinding 设置为 null,而 Activity 则不需要。 https://developer.android.com/topic/libraries/view-binding

原因对我来说很明显,因为 Activity 将与它的 View 一起被销毁,但对于 Fragment 不会(Fragment 比它的 View 寿命更长,即当 Fragment 被替换时)。

但是,对于 RecyclerView,如果我们在 ViewHolder 中有 ViewBinding,就像下面的示例(取自 https://stackoverflow.com/a/60427658/3286489),其中 PaymentHolder 存储了一个 ViewBinding(即 itemBinding)。我们需要将其设置为空吗?

class PaymentAdapter(private val paymentList: List<PaymentBean>) : RecyclerView.Adapter<PaymentAdapter.PaymentHolder>() {
  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PaymentHolder {
    val itemBinding = RowPaymentBinding
      .inflate(LayoutInflater.from(parent.context), parent, false)
    return PaymentHolder(itemBinding)
  }
    
  override fun onBindViewHolder(holder: PaymentHolder, position: Int) {
    val paymentBean: PaymentBean = paymentList[position]
    holder.bind(paymentBean)
  }
    
  override fun getItemCount(): Int = paymentList.size
    
  class PaymentHolder(private val itemBinding: RowPaymentBinding) : RecyclerView.ViewHolder(itemBinding.root) {
  
    fun bind(paymentBean: PaymentBean) {
      itemBinding.tvPaymentInvoiceNumber.text = paymentBean.invoiceNumber
      itemBinding.tvPaymentAmount.text = paymentBean.totalAmount
    }
  }
}

我的猜测是 ViewHolder 中的 viewBinding 不需要设置为 null(或释放),因为 ViewHolder 中的 viewBinding 不会超过 ViewHolder。我假设如果 ViewHolder 与 RecyclerView 分离,并且没有被使用,它将被适配器删除,而不需要我们手动释放它拥有的 ViewBinding。

但是在这里检查以防我的理解不正确。

标签: android android-recyclerview android-viewholder android-viewbinding


【解决方案1】:

答案是不。无需在 ViewHolder 中释放 ViewBinding。

如果我们看到 ViewHolder 实例化

class PaymentHolder(private val itemBinding: RowPaymentBinding) 
: RecyclerView.ViewHolder(itemBinding.root) { ... }

我们注意到 View (itemBinding.root) 被实例化为 ViewHolder 的一部分,只要 ViewHolder 还活着,它就会一直存在。

因此释放 ViewBinding 无助于解决内存泄漏。

更多细节在this article

【讨论】:

    猜你喜欢
    • 2019-09-16
    • 2014-08-26
    • 2023-03-23
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多