在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。
但在这里检查一下,以防我的理解不正确。
1条答案
按热度按时间y1aodyip1#
答案是否定的。不需要释放ViewHolder中的ViewBinding。
如果我们看到ViewHolder示例化
我们注意到视图(
itemBinding.root
)是作为ViewHolder的一部分示例化的,并且只要ViewHolder还活着,它就会一直存在。与Fragment不同,Fragment的寿命可以比视图长,并且视图在Fragment的示例中会发生变化。因此,释放ViewBinding无助于解决内存泄漏问题。
this article中的更多详细说明