0

in my app is a RecyclerView which displays a lot of small Images (200x200, 8kb, WEBP). Now I'm getting an OutOfMemoryError in the crash reports of my developer console. Only Android 7 and 7.1 are affected.

java.lang.OutOfMemoryError: 

  at dalvik.system.VMRuntime.newNonMovableArray (Native Method)

  at android.graphics.BitmapFactory.nativeDecodeAsset (Native Method)

  at android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:700)

  at android.graphics.BitmapFactory.decodeResourceStream (BitmapFactory.java:535)

  at android.graphics.drawable.Drawable.createFromResourceStream (Drawable.java:1179)

  at android.content.res.ResourcesImpl.loadDrawableForCookie (ResourcesImpl.java:770)

  at android.content.res.ResourcesImpl.loadDrawable (ResourcesImpl.java:621)

  at android.content.res.Resources.getDrawable (Resources.java:1640)

  at android.content.Context.getDrawable (Context.java:525)

  at android.support.v4.content.ContextCompat.getDrawable (ContextCompat.java:463)

  at android.support.v7.widget.AppCompatDrawableManager.getDrawable (AppCompatDrawableManager.java:203)

  at android.support.v7.widget.AppCompatDrawableManager.getDrawable (AppCompatDrawableManager.java:191)

  at android.support.v7.content.res.AppCompatResources.getDrawable (AppCompatResources.java:102)

  at android.support.v7.widget.AppCompatImageHelper.setImageResource (AppCompatImageHelper.java:86)

  at android.support.v7.widget.AppCompatImageView.setImageResource (AppCompatImageView.java:94)

  at com.censored.censored.Tab1Adapter.onBindViewHolder (Tab1Adapter.java:135)

  at com.censored.censored.Tab1Adapter.onBindViewHolder (Tab1Adapter.java:19)

  at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder (RecyclerView.java:6781)

  at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder (RecyclerView.java:6823)

  at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline (RecyclerView.java:5752)

  at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline (RecyclerView.java:6019)

  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:5858)

  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:5854)

  at android.support.v7.widget.LinearLayoutManager$LayoutState.next (LinearLayoutManager.java:2230)

  at android.support.v7.widget.GridLayoutManager.layoutChunk (GridLayoutManager.java:557)

  at android.support.v7.widget.LinearLayoutManager.fill (LinearLayoutManager.java:1517)

  at android.support.v7.widget.LinearLayoutManager.onLayoutChildren (LinearLayoutManager.java:612)

  at android.support.v7.widget.GridLayoutManager.onLayoutChildren (GridLayoutManager.java:171)

  at android.support.v7.widget.RecyclerView.dispatchLayoutStep2 (RecyclerView.java:3924)

  at android.support.v7.widget.RecyclerView.dispatchLayout (RecyclerView.java:3641)

  at android.support.v7.widget.RecyclerView.onLayout (RecyclerView.java:4194)

  at android.view.View.layout (View.java:18798)

  at android.view.ViewGroup.layout (ViewGroup.java:5951)

  at android.widget.RelativeLayout.onLayout (RelativeLayout.java:1079)

  at android.view.View.layout (View.java:18798)

  at android.view.ViewGroup.layout (ViewGroup.java:5951)

  at android.support.v4.view.ViewPager.onLayout (ViewPager.java:1775)

  at android.view.View.layout (View.java:18798)

  at android.view.ViewGroup.layout (ViewGroup.java:5951)

  at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1741)

  at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1585)

  at android.widget.LinearLayout.onLayout (LinearLayout.java:1494)

  at android.view.View.layout (View.java:18798)

  at android.view.ViewGroup.layout (ViewGroup.java:5951)

  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323)

  at android.widget.FrameLayout.onLayout (FrameLayout.java:261)

  at android.view.View.layout (View.java:18798)

  at android.view.ViewGroup.layout (ViewGroup.java:5951)

  at android.support.v4.widget.DrawerLayout.onLayout (DrawerLayout.java:1231)

  at android.view.View.layout (View.java:18798)

  at android.view.ViewGroup.layout (ViewGroup.java:5951)

  at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1741)

  at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1585)

  at android.widget.LinearLayout.onLayout (LinearLayout.java:1494)

  at android.view.View.layout (View.java:18798)

  at android.view.ViewGroup.layout (ViewGroup.java:5951)

  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323)

  at android.widget.FrameLayout.onLayout (FrameLayout.java:261)

  at android.view.View.layout (View.java:18798)

  at android.view.ViewGroup.layout (ViewGroup.java:5951)

  at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1741)

  at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1585)

  at android.widget.LinearLayout.onLayout (LinearLayout.java:1494)

  at android.view.View.layout (View.java:18798)

  at android.view.ViewGroup.layout (ViewGroup.java:5951)

  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323)

  at android.widget.FrameLayout.onLayout (FrameLayout.java:261)

  at android.view.View.layout (View.java:18798)

  at android.view.ViewGroup.layout (ViewGroup.java:5951)

  at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1741)

  at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1585)

  at android.widget.LinearLayout.onLayout (LinearLayout.java:1494)

  at android.view.View.layout (View.java:18798)

  at android.view.ViewGroup.layout (ViewGroup.java:5951)

  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323)

  at android.widget.FrameLayout.onLayout (FrameLayout.java:261)

  at com.android.internal.policy.DecorView.onLayout (DecorView.java:887)

  at android.view.View.layout (View.java:18798)

  at android.view.ViewGroup.layout (ViewGroup.java:5951)

  at android.view.ViewRootImpl.performLayout (ViewRootImpl.java:2648)

  at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2364)

  at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1515)

  at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:7091)

  at android.view.Choreographer$CallbackRecord.run (Choreographer.java:927)

  at android.view.Choreographer.doCallbacks (Choreographer.java:702)

  at android.view.Choreographer.doFrame (Choreographer.java:638)

  at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:913)

  at android.os.Handler.handleCallback (Handler.java:751)

  at android.os.Handler.dispatchMessage (Handler.java:95)

  at android.os.Looper.loop (Looper.java:154)

  at android.app.ActivityThread.main (ActivityThread.java:6682)

  at java.lang.reflect.Method.invoke (Native Method)

  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1520)

  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1410)

The method which causes the crash looks like this:

holder1.itemImageView.setImageResource(imageResources[position]);

        holder1.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View v) {
                final Context context = v.getContext();
                holder1.itemImageView.setImageResource(pressedResource[position]);
                new Handler().postDelayed(new Runnable() {
                    public void run() {
                        holder1.itemImageView.setImageResource(imageResources[position]);
                    }
                }, 500);
                new Thread(new Runnable() {
                    @Override
                    public void run() {


                        EventHandlerClass.startMediaPlayer(v, soundID);
                    }
                }).start();

            }
        });

I saw some solutions on Stackoverflow including an image loading library for example Glide. But my app should also be usable offline. Is there any other solution to prevent the OutOfMemory crash without using Glide or Picasso?

I also read about using this in the Manifest:

<application
    android:largeHeap="true">
TheUseracc awd
  • 444
  • 2
  • 5
  • 16
  • why you don't want to use Glide. Glide can also load image from drawable or uri etc. – Amit Tiwary Oct 25 '19 at 16:27
  • @AmitTiwary Oh, really? Didn't find anything about that on google, can you post a link on how to use Glide with images from drawable? – TheUseracc awd Oct 25 '19 at 17:10
  • check this answer https://stackoverflow.com/questions/29982341/using-glide-for-android-how-do-i-load-images-from-asset-and-resources – Amit Tiwary Oct 25 '19 at 17:37
  • Thanks I tried to write this line: Glide.with(this).load(imageResources[position]).into(holder1.itemImageView); But "this" is underlined, what context do I have to use? Or how do I find the context – TheUseracc awd Oct 25 '19 at 17:44

1 Answers1

0

you should use the PICASSO library for getting images from URI or drawable. Use this line of code to display a drawable image using PICASSO.

Picasso.get().load(imageResources[position]).into(holder1.itemImageView); you will create an array of drawables which you want to display in your adapter.

Rana Aamer
  • 21
  • 2