gpt4 book ai didi

android - 如何克服此错误 :java. lang.OutOfMemoryError:位图大小超出 VM 预算

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:51:12 25 4
gpt4 key购买 nike

我正在尝试在 Sqlite DB 中添加图像并将图像从 DB 列出到 ListView ....我正在存储图像路径以获取图像。当我在设备中列出来自数据库的图像时,出现类似 java.lang.OutOfMemoryError: bitmap size exceeds VM budget

的错误

我每次都清除堆内存吗?如何纠正这个问题。这是我的代码。

LView.class

mySQLiteAdapter = new SQLiteAdapter(this);
mySQLiteAdapter.openToWrite();
mAlbum = (ImageView) findViewById(R.id.iv);
mAlbum.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, IMG);
}
});

Button click = (Button) findViewById(R.id.button);
click.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mySQLiteAdapter.insert(str);
System.out.println(str+" Added");
Intent intent = new Intent(LView.this, MyList.class);
startActivity(intent);
}
});`

`

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {

case 1:
if(resultCode == RESULT_OK) {
Uri selectedUri = data.getData();
str = getPath(selectedUri);
Bitmap bitmap;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedUri));
mAlbum.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
}
}
// Converting image path Uri to String path to store in DB
public String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cur = managedQuery(uri, projection, null, null, null);
int columnIndex = cur.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cur.moveToFirst();

return cur.getString(columnIndex);
}`

请建议我...提前致谢。

最佳答案

1)先尝试解码绑定(bind)的图片

您获取图像的实际大小以防止 OOM 问题。不要先解码图像!!!

    BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;

BitmapFactory.decodeByteArray(bitmapByteArray, 0, bitmapByteArray.length, options);'

options.outWidth 和 options.outHeight 是你想要的。

2) 计算样本大小

使用 http://hi-android.info/src/com/android/camera/Util.java.html 中的以下代码.如果您检测到 outWidth 和 outHeight 太大而不会出现 OOM 问题,只需将 outWidth 和 outHeight 设置为较小的尺寸即可。它会给你一个样本大小,解码后的图像将被设置为那些 outWidth 和 outHeight。此处的位图选项与您在步骤 1 中使用的相同。

    private static int computeInitialSampleSize(BitmapFactory.Options options,
int minSideLength, int maxNumOfPixels) {
double w = options.outWidth;
double h = options.outHeight;

int lowerBound = (maxNumOfPixels == IImage.UNCONSTRAINED) ? 1 :
(int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
int upperBound = (minSideLength == IImage.UNCONSTRAINED) ? 128 :
(int) Math.min(Math.floor(w / minSideLength),
Math.floor(h / minSideLength));

if (upperBound < lowerBound) {
// return the larger one when there is no overlapping zone.
return lowerBound;
}

if ((maxNumOfPixels == IImage.UNCONSTRAINED) &&
(minSideLength == IImage.UNCONSTRAINED)) {
return 1;
} else if (minSideLength == IImage.UNCONSTRAINED) {
return lowerBound;
} else {
return upperBound;
}
}

3) 使用计算出的样本大小

获得样本量后,使用它来解码真实图像数据。

            options.inTempStorage = new byte[16*1024];
options.inPreferredConfig = (config == null)?BitmapUtil.DEFAULT_CONFIG:config;
options.inSampleSize = BitmapUtil.computeSampleSize(bitmapWidth, bitmapHeight, bitmapWidth < bitmapHeight?targetHeight:targetWidth, bitmapWidth < bitmapHeight?targetWidth:targetHeight, 1);
options.inPurgeable = true;
options.inInputShareable = true;
options.inJustDecodeBounds = false;
options.inDither = true;
result = BitmapFactory.decodeByteArray(bitmapByteArray, 0, bitmapByteArray.length, options);

~如果这仍然给你 OOM 问题,你可以尝试降低 outWidth 和 outHeight。位图使用 native 堆,而不是 java 堆。因此很难检测到解码后的新图像还剩下多少内存。


~~如果您必须将 outWidth 和 outHeight 设置得太低,那么您的代码中的某处可能会发生内存泄漏。尝试从您不使用的内存中释放任何对象。例如 bitmap.release();


~~~以上只是一个示例代码。调整你的需要。

关于android - 如何克服此错误 :java. lang.OutOfMemoryError:位图大小超出 VM 预算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7606846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com