2016-11-22 4 views
2

Я пытаюсь разработать приложение галереи изображений. Ошибка отображается на указанной странице. Когда мои загрузки страницы У меня есть изображение Вид внутри ViewPager и горизонтальная полоса в нижней части, где я использовал recycler view.On loadОшибка OutOfMemory при продолжении прокрутки Viewpager, который использовал Glide для загрузки растровых изображений в него

Первые загрузки изображения на ImageView в ViewPager и соответствующее изображение миниатюр подсвечиваются на горизонтальной полосе. При нажатии на миниатюру внизу горизонтальной полосы соответствующее изображение загружается в представление изображения Viewpager. Все мои функции работают по своему желанию. Но когда я постоянно прокручиваю viewpager даже после того, как я дал большую кучу для моего приложения, приложение перестает отвечать на запросы/сбои. На графике памяти Log and Android Monitors я мог четко понять, что это ошибка OOM. Теперь наступает ключевой фактор, который я использовал Glide для загрузки изображений в представление изображения на viewpager. Для того, чтобы убедиться, что Glide освобождает растровое он использует я использовал следующие методы:

Glide 
.diskCacheStrategy(DiskCacheStrategy.NONE) 
.skipMemoryCache(true) 

Я также называется,

Glide.get(context).clearMemory(); 
     AsyncTask.execute(new Runnable() { 
     @Override 
     public void run() { 
      //TODO your background code 
      Glide.get(context).clearDiskCache(); 
     } 
    }); 

в методе destroyItem зрения пейджера.

Кроме того, я использовал следующий код глиссады для загрузки растрового изображения в поле зрения изображения:

Glide 
.into(new SimpleTarget<Bitmap>() { 
@Override 
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { 
    mediaDetails.get(curPos).getFullImageView().setImageBitmap(resource); 
         } 
     } 

Мне нужен растровый ресурс, так как я осуществившие масштабировании и панорамирование функции на представлении изображения. Каким будет самый эффективный способ освободить растровое изображение, созданное при просмотре представления пейджера представления. Или есть ли другой способ справиться с этой проблемой? Ваша помощь будет наиболее ценной.

+0

Вы устанавливаете предел смещения на ваш плейер просмотра? – savepopulation

+0

@saveпопуляция его установленного значения по умолчанию, то есть 1. Я попытался изменить лимит, но затем вернул обратно. Решение masoud vali дало мне некоторую отсрочку. Даже решение Ramz аналогично, за исключением того, что класс должен быть добавлен. –

+0

Да, их решения должны работать. Я просто задался вопросом, устанавливаете ли вы ограничение смещения на большое число, которое может вызвать эту ситуацию. – savepopulation

ответ

1

при загрузке использовать override, чтобы изменить размер точечного рисунка:

Glide 
.with(context) 
.load(url) 
.override(200, 200) 
.into(imageView); 
1

Попробуйте приведенный ниже код, Это поможет вам изменить размер точечного рисунка и остановить OutOfMemory исключение.

Инициализировать переменные,

private static final int MAX_WIDTH = 370; 
private static final int MAX_HEIGHT = 370; 

Установить изображение в ImageView с помощью скольжению,

Glide.with(context_tab1).load(url).error(R.drawable.loader_bg).placeholder(R.drawable.loader_bg).transform(new BitmapTransform(MAX_WIDTH, MAX_HEIGHT)).into(holder.image); 

Добавьте приведенный ниже код для растрового преобразования,

public class BitmapTransform implements Transformation { 

    int maxWidth; 
    int maxHeight; 

    public BitmapTransform(int maxWidth, int maxHeight) { 
     this.maxWidth = maxWidth; 
     this.maxHeight = maxHeight; 
    } 

    @Override 
    public Bitmap transform(Bitmap source) { 
     int targetWidth, targetHeight; 
     double aspectRatio; 

     if (source.getWidth() > source.getHeight()) { 
      targetWidth = maxWidth; 
      aspectRatio = (double) source.getHeight()/(double) source.getWidth(); 
      targetHeight = (int) (targetWidth * aspectRatio); 
     } else { 
      targetHeight = maxHeight; 
      aspectRatio = (double) source.getWidth()/(double) source.getHeight(); 
      targetWidth = (int) (targetHeight * aspectRatio); 
     } 

     Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false); 
     if (result != source) { 
      source.recycle(); 
     } 
     return result; 
    } 

    @Override 
    public String key() { 
     return maxWidth + "x" + maxHeight; 
    } 

} 
0

Если перемещение в другую библиотеку, не проблема, я рекомендую вам использовать Fresco.

Согласно одному из инженеров по проекту Fresco:

Изображения не хранятся в куче Java, но в ashmem куче. Буферы промежуточного байта также сохраняются в нативной куче. Этот оставляет намного больше памяти для использования приложениями. Это снижает риск ошибок OutOfMemoryErrors. Это также уменьшает количество мусора приложения, которые должны делать, что приводит к повышению производительности.