Как исправить OutOfMemoryError без использования библиотеки загрузки изображений - PullRequest
0 голосов
/ 25 октября 2019

в моем приложении - RecyclerView, который отображает множество маленьких изображений (200x200, 8kb, WEBP). Теперь я получаю OutOfMemoryError в отчетах о сбоях моей консоли разработчика. Это касается только Android 7 и 7.1.

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)

Метод, вызывающий сбой, выглядит следующим образом:

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();

            }
        });

Я видел некоторые решения в Stackoverflow, включая библиотеку загрузки изображений, например Glide,Но мое приложение также должно быть доступно в автономном режиме. Есть ли другое решение для предотвращения сбоя OutOfMemory без использования Glide или Picasso?

Я также читал об использовании этого в манифесте:

<application
    android:largeHeap="true">

1 Ответ

0 голосов
/ 25 октября 2019

вы должны использовать библиотеку PICASSO для получения изображений из URI или отрисовки. Используйте эту строку кода, чтобы отобразить нарисованное изображение, используя PICASSO.

Picasso.get().load(imageResources[position]).into(holder1.itemImageView); , вы создадите массив рисунков, которые вы хотите отобразить в своем адаптере.

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