在RecyclerView.Adapter中保留Context / Activity实例是否泄漏安全?

Bam*_*amx 5 android memory-leaks android-recyclerview

给定这样的适配器:

public class MyAdapter extends RecyclerView.Adapter {

    private final Activity mActivity;
    private final List<Item> mItemList;

    public MyAdapter(Activity activity, List<Item> itemList) {
        this.mActivity = activity;
        this.mItemList = itemList;
    }

    //[...]

    public void onBindViewHolder(ViewHolder holder, int position) {
        final Item i = mItemList.get(position);
        holder.launchButton.setOnClickListener(new OnClickListener() {
                @Override public void onClick(View v) {
                    mActivity.startActivity(i.getIntent());
            });
    }

}
Run Code Online (Sandbox Code Playgroud)

如您所见,启动实例需要活动实例。当然,还有其他方法可以做到这一点(例如使用接口),但问题的关键是在适配器中保留对mActivity实例的硬引用是否安全

Jan*_*ser 5

是的,很好。一旦没有从根对象强烈引用对象,Android的垃圾回收将回收对象。该适配器由RecyclerView引用,并且在释放该Activity之前,该RecyclerView将符合垃圾回收的条件,因此,在应回收该Activity时,该RecyclerView将符合垃圾回收的条件,因此不会阻止垃圾回收。从垃圾收集活动。同样,如果Activity引用了适配器,就好了,就像两个对象仅相互引用一样,它们不能从根对象访问,因此都可以进行垃圾回收。