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

时间:2017-01-27 06:30:01

标签: 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());
            });
    }

}

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

3 个答案:

答案 0 :(得分:4)

是的,没关系。一旦没有来自根对象的强引用,Android的垃圾收集将回收对象。 RecyclerView引用适配器,并且在释放Activity之前,RecyclerView将有资格进行垃圾收集,因此,当Activity应该被回收时,RecyclerView将有资格进行垃圾收集,因此它不会阻止垃圾收集的活动。此外,如果Activity具有对Adapter的引用,就好了,好像两个对象只有对彼此的引用,它们不能从root对象访问,因此都有资格进行垃圾回收。

答案 1 :(得分:1)

我认为这种方法没有问题,但您实际上并不需要Activity个实例来调用startActivity,任何Context都可以。您可以通过Context获取holder.launchButton.getContext()的实例。

答案 2 :(得分:1)

是的,你可以保留它,在类实例存在之前,Context将继续存在。或者,您可以从任何View或通过返回Context的全局Application类获取Context。

视图不会扩展Context,因此Android通过方法View.getContext()

为视图提供了Context