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

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

}

如您所见,启动 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/

相关文章:

java - API < 21 的 Android 复选框按钮样式

java - 存储一组字符串的最佳方式是什么

android - gradle4.5编译错误:无法添加任务

javascript - 在 Chrome 中获取大型 AJAX 响应而不会崩溃

swift - 使用内部闭包时可能存在内存泄漏

二维数组指针的 C++ 内存泄漏

android - 在 android 中使用 rest api 和解析数据、jackson 或 groovy 的最佳方法是什么?

android - 我可以在 android 2.2 上使用 API 级别 11 吗?

android - 如何点击 recyclerview?

android - RecyclerView 与 StaggeredGridLayoutManager : variable number of columns and vertically scrollable