BamsBamx BamsBamx -4 years ago 125
Android Question

Is it leak-safe to keep a Context/Activity instance in RecyclerView.Adapter?

Given an adapter like this:

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

}


As you can see, the activity instance is needed for launch the intents. Of course, there are other ways to do that (e.g. using interfaces) but the point of the question is if it is safe to keep the hard reference to mActivity instance in the adapter

Answer Source

Yes, it's fine. Android's garbage collection will recycle objects once there is no strong reference to them from the root object. The adapter is referred to by the RecyclerView, and the RecyclerView will be eligible for garbage collection before the Activity is freed, so by the time the Activity should be recycled, the RecyclerView will be eligible for garbage collection, and thus it will not prevent the Activity from being garbage collected. Also, this is fine if the Activity has a reference to the Adapter, as if two objects only have references to each other, they cannot he accessed from the root object, and thus are both eligible for garbage collection.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download