#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) { } });
Комментариев нет:
Отправить комментарий