给定这样的适配器:
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实例的硬引用是否安全
答案 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()