Утечка памяти
В приведенном ниже коде может ли быть проблема утечки памяти?. Есть ли риск для активности? Этот код содержит неявную ссылку на активность в просмотре списка, так что он может создать проблему утечки памяти при ротации или открытии новой активности?
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, вы должны использовать контекст, в котором будет отображаться представление.
Два решения, если вы хотите быть супер экстра уверен, хотя.
Используйте ArrayAdapter
Если вы используете ArrayAdapter, он позаботится обо всем этом для вас. Это встроенный класс, созданный Google для использования с простыми структурами списков. Тогда вам не нужно будет использовать контекст приложения для создания своего представления (что не следует делать, вы должны использовать текущее действие в качестве контекста).
https://developer.android.com/reference/android/widget/ArrayAdapter
Возможно, вы захотите использовать этот конструктор: https://developer.android.com/reference/android/widget/ArrayAdapter.html
Установите для вашего адаптера значение null в вашем методе onDestroy().
Если вы установите для адаптера значение null в OnDestroy, он будет GCed, а не блокировать GC Activity. Просто сохраните частную ссылку на ваш адаптер в вашем классе. Вы можете сделать это вместе с номером один, ничего не повредит.
Я не думаю, что что-то из этого действительно необходимо, такой код - довольно распространенная практика.