2016-12-20 4 views
1

У меня есть возможная проблема (OOM) с загрузкой списка изображений из БД. В моей базе данных изображения хранятся как BLOB. Эти изображения извлекаются и отображаются во Фрагменте с помощью RecyclerView. Изображения загружаются с помощью Скольжение и я использую GridLayoutManager для отображения изображений 3 в одном ряду (фото прилагается):Загрузка списка загруженных байтов Android

Glide 
.with(context) 
.load(image[]) 
.asBitmap() 
.override(dimensionPixelSize) 
.dontAnimate() 
.centerCrop() 
.placeholder(R.drawable.image) 
.into(imageView); 

GridLayout

Когда изображения извлекается из БД, я хранить его в одноточечного класс, а затем использовать этот список изображений при создании адаптера и т.д.

class ImageData { 
    private List<ImageModel> images; 

    private static final ImageDate instance = new ImageData(); 

    private ImageData() { 
    } 

    public static ImageData getInstance() { 
     return instance; 
    } 

    public void setImages(List<ImageModel> images) { 
     this.images = images; 
    } 

    public List<ImageModel> getImages() { 
     return images; 
    } 

} 

ImageModel класс имеет байт [] для фактического изображения и длинных полей временных меток. Также есть возможность показать полноэкранное изображение onClick - в этом случае я создаю DialogFragment с помощью viewPager, а ViewPagerAdapter использует тот же список из класса singleton. Фактическая проблема в том, что иногда я могу получить OOM. Это происходит после 15/20 мин. использования приложения и несколько раз закрытия и открытия приложения. Я знаю, что у Glide есть стратегия памяти и диска, например, я попытался использовать .skipMemoryCache (true) или diskCacheStrategy (DiskCacheStrategy.SOURCE), но без успеха. Можете ли вы помочь мне с некоторым предложением? Если вам нужно, я могу добавить еще немного кода, но в основном я использую шаблон ViewHolder с RecyclerView, и этот код Glide для загрузки изображений находится внутри класса ViewHolder.

+0

'Когда изображения извлекаются из БД, я храню его в одиночном классе, вы не должны этого делать, вместо этого загружайте изображение непосредственно из БД всякий раз, когда это необходимо. –

+0

Хорошо, я попробую таким образом и удалю Singleton class – slena17

+0

'byte [] для фактического изображения'. Что именно? Jpg? Png? Что именно вы храните как BLOB? – greenapps

ответ

0

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

+0

Единственный раз, когда я создаю массив байтов, когда я получаю изображения из БД: ImageModel image = new Image (cursor.getBlog (...)); ' – slena17

+0

@ slena17 любое обновление по этому поводу? –

+0

Привет, я не отправил ответ, потому что я был «между заданиями» и т. Д. И т. Д. В любом случае, я понял, что проблема OOM не связана со списком изображений, а потому, что я неэффективно реализовал код для уничтожения фрагментов внутри viewPager. У меня был viewPager с 5 фрагментами, которые были «тяжелыми» и с постоянно меняющимися экранами, OOM появился в течение 1 минуты. Я хотел бы опубликовать код, но у меня больше нет доступа к репозиторию. – slena17