OnClickListeners中的WeakReference和GC

时间:2016-11-22 11:33:37

标签: java android garbage-collection

假设我们有一些Adapter或ViewHolder,它将OnClickListener作为构造函数参数:

public class PassageDateSpecifiedViewHolder extends BasePassageViewHolder<Passage> {
    WeakReference<PassageRecyclerAdapter.OnItemClickListener> reference;

    public PassageDateSpecifiedViewHolder(View itemView,
                                      PassageRecyclerAdapter.OnItemClickListener listener) {
        super(itemView);
        this.reference = new WeakReference<>(listener); //will reference live as long as my PassageDateSpecifiedViewHolder  class?
    }

    @Override
    protected void onClick(View view, Passage item) {
        PassageRecyclerAdapter.OnItemClickListener localListener = reference.get();
        if (localListener != null) {
            localListener.onItemClick(item);
        }
    }
} 

因此,根据一些指南,我需要针对onClickListeners的WeakReference以避免内存泄漏。这是非常明确的,但是如果我将匿名类传递给我的构造函数或类中,我就无法理解发生了什么,其中创建了onClickListener的实例(或者是侦听器本身)

这意味着没有链接,这个监听器可能会被破坏。告诉我,我错了。

1 个答案:

答案 0 :(得分:0)

  

在将侦听器实现为弱引用之前,您应该通过this问题。

     

如果我将一个匿名类传递给我的构造函数,我无法理解发生了什么   或者类,其中创建了我的onClickListener的实例(或者监听器本身)。

在这种情况下,您的reference.get()将返回null

  

只要我的PassageDateSpecifiedViewHolder类会引用直播吗?

这不保证。它取决于包含监听器的对象。如果该对象被破坏,您将失去对该侦听器的引用。