我有一个包含两列的ArrayList,我在下面显示一个带有文本的图像。我正在使用高质量的图像,需要在网格视图中显示这些图像,并且我使用的是BitmapFactory.Options。我使用谷歌的相同代码,但仍然会引发OutOfMemory错误。
代码:
BitmapFactory.Options obj = new BitmapFactory.Options();
obj.inPurgeable = true;
obj.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.car, obj);
BitmapFactory.decodeResource(getResources(), R.drawable.nature, obj);
obj.inSampleSize = 4;
obj.inJustDecodeBounds = false;
Bitmap homeIcon = BitmapFactory.decodeResource(getResources(), R.drawable.car,obj);
Bitmap userIcon = BitmapFactory.decodeResource(getResources(), R.drawable.nature,obj);
gridArray.add(new Item(homeIcon,"Home"));
gridArray.add(new Item(userIcon,"User"));
gridArray.add(new Item(homeIcon,"House"));
gridArray.add(new Item(userIcon,"Friend"));
gridArray.add(new Item(homeIcon,"Home"));
gridArray.add(new Item(userIcon,"Personal"));
gridArray.add(new Item(homeIcon,"Home"));
gridArray.add(new Item(userIcon,"User"));
gridArray.add(new Item(homeIcon,"Building"));
gridArray.add(new Item(userIcon,"User"));
gridArray.add(new Item(homeIcon,"Home"));
gridArray.add(new Item(userIcon,"xyz"));
更新:
Item.java:
public class Item {
Bitmap image;
String title;
public Item(Bitmap image, String title) {
super();
this.image = image;
this.title = title;
}
public Bitmap getImage() {
return image;
}
public void setImage(Bitmap image) {
this.image = image;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
这是代码,我有另一个类名Item,它有一个构造函数,参数为Bitmap和String。执行此操作时,它会抛出一个OutOfMemoryError。我不确定是否应该在这些代码中添加任何其他附加功能。任何帮助将不胜感激。
答案 0 :(得分:1)
通常在加载大位图时会发生此错误。 ImageButtons的绘图是否具有高分辨率?如果是这样,这可能是错误。您尝试将它们下采样到适当的分辨率,但是为了快速修复,在AndroidManifest.xml文件的android:largeHeap="true"
标记下添加<application>
有时可以让您的应用加载大图像而不会出现内存不足错误。
您使用Google提供相同代码但仍然收到内存不足错误的原因不仅仅是位图的高分辨率,还包括您一次加载的大量内容。
在它们之间添加一个小的等待可以分散负载并根据你的布局制作一个可爱的小动画,只是一个想法(但当然不要在UI线程上这样做)。
祝你好运!
答案 1 :(得分:0)
您可以尝试在AndroidManifest上的应用标记内使用android:largeHeap="true"
,以避免应用中出现内存错误。它会让你的应用程序使用更多内存。
答案 2 :(得分:0)
尝试删除前面的两个解码语句,这些语句会导致问题,因为你的位图在没有采样的情况下被加载
答案 3 :(得分:0)
您可以根据需要修改以下代码。我希望它能为您提供帮助。
Bitmap imageProcess(String path) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
imageBitmap = BitmapFactory.decodeFile(path, options);
options.inSampleSize = calculateInSampleSize(options,
displayMetrics.widthPixels,
(int) (displayMetrics.heightPixels * .75));
options.inJustDecodeBounds = false;
imageBitmap = BitmapFactory.decodeFile(path, options);
return imageBitmap;
}
public int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int heightRatio = Math.round((float) height
/ (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
inSampleSize = heightRatio > widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}