Утечка памяти

В приведенном ниже коде может ли быть проблема утечки памяти?. Есть ли риск для активности? Этот код содержит неявную ссылку на активность в просмотре списка, так что он может создать проблему утечки памяти при ротации или открытии новой активности?

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

1 ответ

Я не думаю, что у вас есть проблема с утечкой здесь. Но не используйте ApplicationContext для этого TextView, вы должны использовать контекст, в котором будет отображаться представление.

Два решения, если вы хотите быть супер экстра уверен, хотя.

  1. Используйте ArrayAdapter

    Если вы используете ArrayAdapter, он позаботится обо всем этом для вас. Это встроенный класс, созданный Google для использования с простыми структурами списков. Тогда вам не нужно будет использовать контекст приложения для создания своего представления (что не следует делать, вы должны использовать текущее действие в качестве контекста).

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

    Возможно, вы захотите использовать этот конструктор: https://developer.android.com/reference/android/widget/ArrayAdapter.html

    1. Установите для вашего адаптера значение null в вашем методе onDestroy().

      Если вы установите для адаптера значение null в OnDestroy, он будет GCed, а не блокировать GC Activity. Просто сохраните частную ссылку на ваш адаптер в вашем классе. Вы можете сделать это вместе с номером один, ничего не повредит.

Я не думаю, что что-то из этого действительно необходимо, такой код - довольно распространенная практика.

Другие вопросы по тегам