android 是否需要释放RecyclerView的ViewHolder中的视图绑定以避免内存泄漏?

hzbexzde  于 2022-12-02  发布在  Android
关注(0)|答案(1)|浏览(406)

在Google提供的ViewBinding示例中,我们需要将片段的viewBinding设置为null,但不需要将Activity的viewBinding设置为null。https://developer.android.com/topic/libraries/view-binding
原因对我来说是显而易见的,因为Activity将与其视图一起被销毁,但Fragment不会(Fragment比其视图活得更长,即当Fragment被替换时)。
然而,对于RecyclerView,如果我们在ViewHolder中有ViewBinding,就像下面的例子(取自https://stackoverflow.com/a/60427658/3286489),其中PaymentHolder存储了一个ViewBinding(即itemBinding)。我们是否需要将其设置为null?

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。
但在这里检查一下,以防我的理解不正确。

y1aodyip

y1aodyip1#

答案是否定的。不需要释放ViewHolder中的ViewBinding。
如果我们看到ViewHolder示例化

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

我们注意到视图(itemBinding.root)是作为ViewHolder的一部分示例化的,并且只要ViewHolder还活着,它就会一直存在。与Fragment不同,Fragment的寿命可以比视图长,并且视图在Fragment的示例中会发生变化。
因此,释放ViewBinding无助于解决内存泄漏问题。
this article中的更多详细说明

相关问题