2

INTRODUCTION:

I work on an android app which has a lot of images. These images are displayed within several recycler views and view pagers. For caching the images I use Fresco which is initialised like this in Application class:

Fresco.initialize(this, ImagePipelineConfig
            .newBuilder(getApplicationContext())
            .setBitmapMemoryCacheParamsSupplier(new BitmapMemoryCacheParamsSupplier(getApplicationContext()))
            .setDownsampleEnabled(true)
            .build());

When images are displayed within RecyclerView I use SimpleDraweeView and are loaded like this:

   val imageRequest = ImageRequestBuilder
                .newBuilderWithSource(Uri.parse(imageUrl))
                .setResizeOptions(ResizeOptions(50, 10))
                .build()

  (itemView as SimpleDraweeView).setImageRequest(imageRequest)

Should also be noted that for each request in order to avoid memory caching the images the following line is called

Fresco.getImagePipeline().evictFromMemoryCache(Uri.parse(imageUrl))

I also load images within view pagers where I use ZoomableDraweeView need also for zooming in, for those cases images are loaded like this:

val view = ZoomableDraweeView(container.context)
        view.setAllowTouchInterceptionWhileZoomed(true)
        view.controller = Fresco.newDraweeControllerBuilder()
                .setImageRequest(ImageRequestBuilder.newBuilderWithSource(Uri.parse(imageUrls[position]))
                        .setResizeOptions(ResizeOptions(50, 20)).build()).build()

Also for these requests I avoid using the memory caching and I use

Fresco.getImagePipeline().evictFromMemoryCache(Uri.parse(imageUrls[position]))

As well should be noted that each time the user leaves these Activities that contain images I have this:

@Override
protected void onStop() {
    super.onStop();
    Fresco.getImagePipeline().clearMemoryCaches();
}

THE PROBLEM:

The issue is that on some devices at some point while scrolling through these images my app crashes with Out Of Memory

QUESTION

Is there any way I could improve the Fresco setup, or is there anything I'm missing that could help me get rid of OOM ?

UPADTE WITH CRASH LOG:

  java.lang.OutOfMemoryError: Failed to allocate a 2833932 byte allocation with 1972896 free bytes and 1926KB until OOM
                         E      at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                         E      at android.graphics.Bitmap.nativeCreate(Native Method)
                         E      at android.graphics.Bitmap.createBitmap(Bitmap.java:975)
                         E      at android.graphics.Bitmap.createBitmap(Bitmap.java:946)
                         E      at android.graphics.Bitmap.createBitmap(Bitmap.java:913)
                         E      at android.graphics.drawable.VectorDrawable$VectorDrawableState.createCachedBitmapIfNeeded(VectorDrawable.java:834)
                         E      at android.graphics.drawable.VectorDrawable.draw(VectorDrawable.java:318)
                         E      at android.graphics.drawable.LayerDrawable.draw(LayerDrawable.java:916)
                         E      at com.facebook.drawee.drawable.ForwardingDrawable.draw(ForwardingDrawable.java:185)
                         E      at com.facebook.drawee.drawable.ScaleTypeDrawable.draw(ScaleTypeDrawable.java:123)
                         E      at com.facebook.drawee.drawable.FadeDrawable.drawDrawableWithAlpha(FadeDrawable.java:302)
                         E      at com.facebook.drawee.drawable.FadeDrawable.draw(FadeDrawable.java:289)
                         E      at com.facebook.drawee.drawable.ForwardingDrawable.draw(ForwardingDrawable.java:185)
                         E      at com.facebook.drawee.generic.RootDrawable.draw(RootDrawable.java:81)
Uruos
  • 83
  • 8

0 Answers0