在我的应用中,有一个很大的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"
喜欢这张图片