Пикассо выдает нехватку памяти при загрузке изображения

Я использую Picasso для загрузки изображений с моего сервера и отображения их в ImageView.

Я наблюдаю некоторые отчеты о сбоях с телефона пользователя, где происходит исключение нехватки памяти, когда Пикассо пытается загрузить изображение в ImageView.

Трассировка стека, как показано ниже:

java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:832)
at android.content.res.Resources.loadDrawable(Resources.java:2988)
at android.content.res.Resources.getDrawable(Resources.java:1558)
at android.widget.ImageView.resolveUri(ImageView.java:646)
at android.widget.ImageView.setImageResource(ImageView.java:375)
at com.squareup.picasso.PicassoDrawable.setPlaceholder(PicassoDrawable.java:62)
at com.squareup.picasso.RequestCreator.into(RequestCreator.java:520)
at com.squareup.picasso.RequestCreator.into(RequestCreator.java:462)
at com.mycompany.myAdapter.getView(MyAdapter.java:102)
at android.widget.AbsListView.obtainView(AbsListView.java:2608)
at android.widget.GridView.makeAndAddView(GridView.java:1346)

Код рядом с MyAdapter.java:102, как показано ниже:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {

    .....Some code .....

    Picasso.with(mContext)
    .load(url_to_server)
    .placeholder(R.drawable.default_placeholder)
    .into(holder.imageItem);  // Line 102

    .....Some code .....

    return convertView;
    }

Что-то не так с тем, как я использую эту библиотеку?


person Calvin    schedule 23.07.2014    source источник
comment
это в setPlaceholder, что указывает на то, что R.drawable.default_placeholder очень большое изображение?   -  person njzk2    schedule 23.07.2014
comment
Это png-файл размером 270x200 1,9 КБ. (Но давайте предположим, что он большой, разве Пикассо не справится с этим?)   -  person Calvin    schedule 23.07.2014
comment
примечание: 1,9 КБ - это сжатый размер, который не имеет значения. размер в памяти 270*200*4 = 216КБ. Впрочем, это не так уж и много. Возможно, это скорее симптом другой проблемы с памятью, так как когда память заполняется, только последнее выделение вызывает сбой.   -  person njzk2    schedule 23.07.2014
comment
вы загружаете большое изображение в свой ImageView? если это так, попробуйте изменить его размер. использовать Picasso.with(context).load(bitmapUrl).resize(width, height).centerInside().into(imageView)   -  person chip    schedule 28.07.2014


Ответы (2)


Для загрузки небольших изображений, таких как значки или программы запуска, мы можем использовать .setImageResource(image). Однако для загрузки больших изображений лучше использовать Picasso и получить преимущества простоты и локального кэширования.

Необходимо правильно настроить Picasso согласно документации:

«Обязательно используйте fit() для изменения размера изображения перед загрузкой в ​​ImageView. В противном случае вы будете потреблять дополнительную память, будете испытывать медленную прокрутку или столкнетесь с проблемами нехватки памяти, если будете отображать много изображений».

if (imageUri != null && !imageUri.isEmpty()) {
   Picasso.with(context).load(imageUri)
  .fit().centerCrop()
  .placeholder(R.drawable.user_placeholder)
  .error(R.drawable.user_placeholder_error)
  .into(imageView);
}
person yaircarreno    schedule 19.01.2016

Преобразуйте свое изображение в растровое изображение и эффективно загружайте изображение

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html и проверьте этот URL тоже Странная проблема нехватки памяти при загрузке изображения в растровый объект

если вы используете какую-либо задержку при загрузке изображений (например, таймер), пожалуйста, проверьте это

я надеюсь, что это поможет вам...

person Sarath Kumar    schedule 08.11.2014