给定这样的适配器:
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());
});
}
}
如您所见,启动 Intent 需要 Activity 实例。当然,还有其他方法可以做到这一点(例如使用接口(interface)),但问题的关键是在适配器中保留对 mActivity 实例的硬引用是否安全
最佳答案
是的,没关系。一旦根对象没有强引用,Android 的垃圾回收就会回收对象。适配器由 RecyclerView 引用,在 Activity 被释放之前 RecyclerView 将有资格进行垃圾回收,因此当 Activity 应该被回收时,RecyclerView 将有资格进行垃圾回收,因此不会阻止被垃圾收集的 Activity 。此外,如果 Activity 具有对 Adapter 的引用,这也很好,就好像两个对象仅相互引用一样,它们不能从根对象访问,因此都符合垃圾回收的条件。
关于android - 将 Context/Activity 实例保留在 RecyclerView.Adapter 中是否是泄漏安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41888106/