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