在我的应用中,有一个很大的RecyclerView,其中包含许多ImageView,每个ImageView内都是一个可绘制对象(200x200,12kb)。
在RecyclerView中,大约有50个ImageView。

如果单击一个ImageView,图像将变为按下的版本,并且会播放声音,就像将许多不同图像作为按钮的音板一样。

我的问题是在开发人员控制台中收到以下崩溃报告:

java.lang.OutOfMemoryError:
  at dalvik.system.VMRuntime.newNonMovableArray (Native Method)
  at android.graphics.BitmapFactory.nativeDecodeAsset (Native Method)
  at android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:856)
  at android.graphics.BitmapFactory.decodeResourceStream (BitmapFactory.java:675)
  at android.graphics.drawable.Drawable.createFromResourceStream (Drawable.java:2228)
  at android.content.res.Resources.loadDrawableForCookie (Resources.java:4211)
  at android.content.res.Resources.loadDrawable (Resources.java:4085)
  at android.content.res.Resources.getDrawable (Resources.java:2005)
  at android.content.res.Resources.getDrawable (Resources.java:1987)
  at android.content.Context.getDrawable (Context.java:464)
  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.tresgames.terscope.Tab3Adapter$1.onClick (Tab3Adapter.java:102)
  at android.view.View.performClick (View.java:5697)
  at android.view.View$PerformClick.run (View.java:22526)
  at android.os.Handler.handleCallback (Handler.java:739)
  at android.os.Handler.dispatchMessage (Handler.java:95)
  at android.os.Looper.loop (Looper.java:158)
  at android.app.ActivityThread.main (ActivityThread.java:7224)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1230)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)


这行是粗体的:

at com.tresgames.terscope.Tab3Adapter$1.onClick (Tab3Adapter.java:102)


这是带有onClick方法的类:

    @Override
    public void onBindViewHolder(final SoundboardViewHolder holder3, final int position) {
        final SoundObject object = soundObjects.get(position);

        final Integer soundID = object.getItemID();

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

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

        holder3.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {

 choose between several actions
                EventHandlerClass.popupManager(v, object);
                return true;
            }
        });
    }


我听说过通过回收位图来解决OutOfMemory错误,但是我对Java还是很陌生,所以我不知道该如何解决这个问题。
该应用程序上的所有内容都可以完美替代,我希望有人可以帮助我。

如果您需要更多信息或代码,我会立即发送。

谢谢

最佳答案

第一个建议是使用滑行
并添加

android:largeHeap="true"


喜欢这张图片

java - 如何修复ImageView引起的java.lang.OutOfMemoryError?-LMLPHP

10-07 13:41
查看更多