首页 > 解决方案 > 内存泄漏 listview baseadapter

问题描述

在下面的代码中,可能有任何内存泄漏问题吗?。是否存在活动风险?。此代码在列表视图中包含活动的隐式引用,因此它可能会在旋转或打开新活动时产生泄漏内存问题?

adapter = new BaseAdapter() {
        @Override
        public int getCount() {
            return searchList == null ? 0 : searchList.size();
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            if(convertView == null) {
                convertView = new TextView(getApplicationContext());
            }
            ((TextView) convertView).setText(searchList.get(position));
            return null;
        }
    };
    myListView.setAdapter(adapter);

标签: androidmemory-leaksandroid-memorylistview-adapter

解决方案


我认为您在这里没有泄漏问题。但是不要对那个 TextView 使用 ApplicationContext,你应该使用视图将出现的上下文。

如果您想非常确定,则有两种解决方案。

  1. 使用 ArrayAdapter

    如果您使用 ArrayAdapter,它将为您处理几乎所有这些。它是 google 制作的用于简单列表结构的内置类。然后你不需要使用应用程序上下文来创建你的视图(你不应该这样做,你应该使用当前活动作为上下文)。

    https://developer.android.com/reference/android/widget/ArrayAdapter

    您可能想使用此构造函数:https://developer.android.com/reference/android/widget/ArrayAdapter.html#ArrayAdapter(android.content.Context,%20int,%20T[])

    1. 在 onDestroy() 方法中将适配器设置为 null。

      如果您在 OnDestroy 中将您的适配器设置为 null,它将被 GC,并且不会阻塞 Activity 的 GC。只需在您的班级中保留对您的适配器的私有引用。您也可以与第一名一起执行此操作,不会造成任何伤害。

我认为这些都不是真的必要,这样的代码是很常见的做法。


推荐阅读