【问题标题】:memory leak listview baseadapter内存泄漏 listview baseadapter
【发布时间】:2018-10-31 18:40:18
【问题描述】:

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

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

【问题讨论】:

    标签: android memory-leaks android-memory listview-adapter


    【解决方案1】:

    我认为您这里没有泄漏问题。但是不要对那个 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。只需在您的班级中保留对您的适配器的私有引用。你也可以和第一名一起做,不会有任何伤害。

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

    【讨论】:

    • 但是listview适配器在这里有一个隐式的activity引用。所以它可以防止垃圾收集器的释放。
    • 通过搜索列表?我不会担心的。将列表传递给适配器是很常见的。如果您想 100% 确定,请使用 ArrayAdapter,它直接采用一个数组,我相信 Google 已经对其内存泄漏问题进行了审查。或者,只需在您的活动中保留对适配器的私有引用,并在您的 onDestroy() 方法中将其设置为 null。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多