Размер кучи увеличился при прокрутке в Android-браузере ListView

Я хочу разработать приложение, подобное приложению facebook. (** (т.е.) ** Загрузка изображений, Тексты, Видео в элементе списка с бесконечными строками списка). Здесь я показываю дискретизированное изображение (inSamplesize = 4) в элементе listview, чтобы уменьшить использование размера кучи.

На этот раз размер кучи продолжает увеличиваться при прокрутке списка. Я предполагаю, что это из-за объекта изображения в элементе списка не переработано. Если размер кучи продолжает увеличиваться, может возникнуть вероятность исключения OOM (вне памяти). Как достичь этой концепции и обеспечить вероятность исключения OOM меньше?.

3 ответа

Убедитесь, что вы используете шаблон view holder в adapter listview's:

http://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html

Или выполните некоторые поисковые запросы, в основном все приложения должны следовать этому шаблону.


Не используйте изображения большого размера, если u отображает изображения в списке для больших пальцев, они изменяют их только в соответствии с вашим пользовательским интерфейсом. Приложения для Android получают меньше 20 МБ для его выполнения, поэтому использование больших изображений превышает доступную память.

и добавьте android:largeHeap="true" в теге приложения вашего манифеста.


  1. Повторное использование convertView в getView() listadapter должно решить исключение OOM.

    public View getView(int position, View convertView, ViewGroup parent) { 
    
     if (convertView == null) {
     convertView = mInflater.inflate(R.layout.yourlayout, null);
     }
    
     ImageView iv = (ImageView) convertView.findViewById(R.id.image);
     iv.setImageResource(R.drawable.image);
     return convertView;
    }
  2. Использование ViewHolder с помощью вышеперечисленного ускорит прокрутку

    static class ViewHolder {
     private ImageView imageView;
    }
    
    public View getView(int position, View convertView, ViewGroup parent) {
    
     ViewHolder holder;
    
     if (convertView == null) {
     convertView = mInflater.inflate(R.layout.yourlayout, null);
     holder = new ViewHolder();
     holder.imageView = (ImageView) convertView.findViewById(R.id.image);
     convertView.setTag(holder);
     }
     else {
     holder = (ViewHolder) convertView.getTag();
     }
    
     holder.ImageView.setImageResource(R.drawable.image);
     return convertView;
    }

licensed under cc by-sa 3.0 with attribution.