Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Picasso проблемы с кешированием и нехваткой памяти

#java #android


Использую библиотеку Picasso. И столкнулся с проблемами и ошибками:


  E/Bitmap﹕ createBitmap error!


Пример кода:

Picasso
    .with(this)
    .load(object.getImages([1])
    .error(R.drawable.video_cap)
    .into(exVideo); 


Поначалу всё работает, но позже (когда смотрю по второму кругу) выходит краш "Out
of memory". Я использовал методы fit() и resize() - приложение работает дольше, но
заканчивается одинаково.

Обработав ошибку:

try {                 
    Picasso.with(this)
        .load(object.getImages([1])
        .error(R.drawable.video_cap)
        .into(exVideo);
} catch (OutOfMemoryError e) {}


приложение больше не падает. Но фотографии больше не загружаются и приложение начинает
тормозить. Как я понимаю, Picasso занял всю оперативную память и больше нет места под
новые фотографии.

Мне надо как-то стереть фотографии из оперативной памяти, чтоб отобразить новые.

Использование memoryPolicy(MemoryPolicy.NO_CACHE), не подойдёт. Я кеширую фотки на
SD карту прописав этот код в классе Application:

Picasso.Builder builder = new Picasso.Builder(this);
builder.downloader(new OkHttpDownloader(this,Integer.MAX_VALUE));
Picasso built = builder.build();
Picasso.setSingletonInstance(built);


Я храню ссылки на фотки в базе, и Picasso потом успешно их загружает.

Итого у меня 3 вопроса:


как освободить место в оперативной памяти под новые фотки
как кешировать на SD карту только нужные фотки, а не все
как обработать ошибку "E/Bitmap﹕ createBitmap error!"


По нажатию на кнопку я загружаю новые изображения

if (object.getImages().length > 1) {
        try {
            Log.e("test", "load picasso 1");
            Picasso.with(this).load(object.getImages()[1]).fit().tag("tag1").error(R.drawable.video_cap).into(exVideo);
        }catch (OutOfMemoryError e) {
            Log.e("test", "error 1" + e);
            Picasso.with(this).load(object.getImages()[1]).fit().memoryPolicy(MemoryPolicy.NO_CACHE).into(exVideo);
        }catch (Exception e){
            Log.e("test", "error 11" + e);
        }
}

    


Ответы

Ответ 1



Попробуйте использовать вместо .into(exVideo); использовать следующий код, который масштабирует изображение до его отображения: .into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { int targetWidth = exVideo.getWidth(); float ratio = (float) bitmap.getHeight() / (float) bitmap.getWidth(); float heightFloat = ((float) targetWidth) * ratio; final android.view.ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) holder.image.getLayoutParams(); layoutParams.height = (int) heightFloat; layoutParams.width = (int) targetWidth; holder.image.setLayoutParams(layoutParams); holder.image.setImageBitmap(bitmap); } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } });

Комментариев нет:

Отправить комментарий