Поймать ошибку OutOfMemory и попробовать отобразить уменьшенное изображение? - PullRequest
0 голосов
/ 26 октября 2019

У меня есть RecyclerView со множеством маленьких изображений (200x200, 8kb). В консоли разработчика я получаю множество отчетов о сбоях OOM с устройств с Android версии 7 и 7.1.

Это сбой OutOfMemory:

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)

И этот код вызываетcrash:

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);
        // Calls a method that plays the sound
        // Should be handled in an extra thread
        new Thread(new Runnable() {
            @Override
            public void run() {


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

    }
});

Могу ли я поймать сбой OOM и сказать ему использовать изображение меньшего размера? Если да, как мне это сделать?

Я уже пытался использовать библиотеку загрузки изображений Пикассо для предотвращения сбоя OOM, но это приводит к тому, что изображение загружается слишком долго, поэтому оно выглядит следующим образом: https://media.giphy.com/media/STlGbpXvT8B9iBvnQS/giphy.gif

Или есть какой-то другой способ устранить ошибку OOM?

Мне действительно нужна помощь, в настоящий момент я получаю много плохих отзывов о причине аварии.

Спасибо:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...