2016-04-27 3 views
1

У меня есть RecyclerView, у которых есть много предметов (100+). Каждый элемент - ImageView. В каждом ImageView я поставил Bitmap используя Picasso библиотеку так:Android picasso outofmemory при загрузке изображений на recyclerview

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    String photoUrl = photos.get(position).getPath(); 
    File photoFile = new File(photoUrl); 
    Picasso.with(context).load(photoFile).fit().centerCrop().into(holder.photo); 
} 

Моя проблема заключается в том, что я ловлю StackTrace в LogCat:

04-27 14:48:43.613 27706-27740/com.rcd.perfecto E/dalvikvm-heap: Out of memory on a 30720016-byte allocation. 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm: "Picasso-/storage/emulated/0/DCIM/Camera/IMG_20150921_100202_HDR.jpg" prio=5 tid=25 RUNNABLE 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm: | group="main" sCount=0 dsCount=0 obj=0x42badb28 self=0x560cd3c0 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm: | sysTid=27740 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1443672328 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm: | state=R schedstat=(818421079 614394933 1660) utm=75 stm=6 core=0 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm:  at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm:  at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:627) 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm:  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:603) 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm:  at com.squareup.picasso.BitmapHunter.decodeStream(BitmapHunter.java:142) 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm:  at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:217) 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm:  at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:159) 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm:  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm:  at java.lang.Thread.run(Thread.java:841) 
04-27 14:48:43.613 27706-27740/com.rcd.perfecto I/dalvikvm:  at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:411) 

И если я поймать, что, тогда я получаю OutOfMemoryError и apllication сбой позже. Что я могу сделать, чтобы предотвратить это?

+0

Try, чтобы сделать изображение получить меньше памяти: http://stackoverflow.com/a/10127787/4310784 –

+0

, что ширина и высота рис? – Blackbelt

+0

set picasso placeholder как изображение по умолчанию –

ответ

0

Попробуйте добавить android:largeHeap="true" в вас Application тег в AndroidManefist.xml

+0

Я также сделал это –

+0

@OlegRyabtsev вы можете загружать огромное количество изображений с огромными размерами –

0

Смотрите вы пытаетесь загрузить большой размер файла в изображение с использованием Picassso. Picasso будет использовать исключение памяти, если размер файла, который вы загружаете, превышает 1,5 МБ.

Так что, чтобы загрузить большой файл с помощью picasso, вы должны изменить его размер и загрузить его в изображение. Попробуй это.

Picasso.with(context) 
    .load(photoFile) 
    .transform(new BitmapTransform(300,300)) 
    .skipMemoryCache() 
    .resize(200,200) 
    .centerInside() 
    .into(holder.photo); 
1

Лучше использовать либо .fit() или .resize(width, height).

1) .fit() - Это приведет к отсроченному исполнению запроса до тех пор, пока не будет выложено ImageView. Примечание: этот метод работает только тогда, когда ваша цель - ImageView.

2) .resize(width, height) - Размер изображения будет уменьшен до указанного в пикселях.

См: http://square.github.io/picasso/2.x/picasso/

Смежные вопросы