gpt4 book ai didi

java - 第二次创建位图时内存不足异常

转载 作者:搜寻专家 更新时间:2023-11-01 08:55:00 24 4
gpt4 key购买 nike

在我的 android 应用程序中,我需要拍照。第一张图片运行良好,可以很好地上传到服务器,因此可以通过电子邮件将其发送给用户。那工作正常。然而,当我想上传第二张图片时,它说内存不足异常。我不知道为什么,但不知何故。

我的 logcat 输出可以在这个 pastebin 链接中找到:http://pastebin.com/uVduy3d9

我处理图像的代码如下:

首先检查手机是否有摄像头:

Camera cam = Camera.open();
if (cam != null) {
if (savedInstanceState != null
&& savedInstanceState.getBoolean("Layout")) {
setContentView(R.layout.registration_edit);
initializeAccountDetails((User) savedInstanceState
.getSerializable(EXTRA_MESSAGE));
inAccountDetails = true;
} else {
setContentView(R.layout.step_4);
((Button) findViewById(R.id.snap)).setOnClickListener(this);
((Button) findViewById(R.id.rotate)).setOnClickListener(this);
cam.stopPreview();
cam.release();
cam = null;
}
} else {
if (savedInstanceState != null
&& savedInstanceState.getBoolean("Layout")) {
setContentView(R.layout.registration_edit);
initializeAccountDetails((User) savedInstanceState
.getSerializable(EXTRA_MESSAGE));
inAccountDetails = true;
} else {
setContentView(R.layout.step_4b);
}
}

当点击按钮 Snap 时,会触发以下 onClick 事件:

@Override
public void onClick(View v) {
if (v.getId() == R.id.snap) {
File directory = new File(Environment.getExternalStorageDirectory()
+ "/BandenAnalyse/Images/");
if (directory.exists()) {
Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
File f = new File(Environment.getExternalStorageDirectory(),
"/BandenAnalyse/Images/IMG_" + _timeStamp + ".jpg");
_mUri = Uri.fromFile(f);
i.putExtra(MediaStore.EXTRA_OUTPUT, _mUri);
startActivityForResult(i, TAKE_PICTURE);
} else {
directory.mkdir();
this.onClick(v);
}
} else {
if (_mPhoto != null) {
Matrix matrix = new Matrix();
matrix.postRotate(90);
_mPhoto = Bitmap.createBitmap(_mPhoto, 0, 0,
_mPhoto.getWidth(), _mPhoto.getHeight(), matrix, true);
((ImageView) findViewById(R.id.photo_holder))
.setImageBitmap(_mPhoto);
_mPhoto.recycle();
}
}
}

当拍照时,结果方法将被触发:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case TAKE_PICTURE:
if (resultCode == Activity.RESULT_OK) {
getContentResolver().notifyChange(_mUri, null);
ContentResolver cr = getContentResolver();
try {
_mPhoto = android.provider.MediaStore.Images.Media
.getBitmap(cr, _mUri);

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int scale = _mPhoto.getWidth() / width;
BitmapFactory.Options o = new BitmapFactory.Options();
o.inSampleSize = 8;
Debug.out(PATH_TO_PHOTO);
Bitmap temp = BitmapFactory.decodeFile(PATH_TO_PHOTO, o);

_mPhoto = Bitmap.createScaledBitmap(
temp,
_mPhoto.getWidth() / scale, _mPhoto.getHeight()
/ scale, false);

temp.recycle();
((ImageView) findViewById(R.id.photo_holder))
.setImageBitmap(_mPhoto);
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT)
.show();
}
}
}
}

错误应该在最后一个方法中,因为当我处于相机模式并想返回我的应用程序时,错误发生了。如何修复此错误?我错过了什么吗?

编辑:

在函数中添加了代码:OnActivityResult。如解决方案之一所述,创建了一个临时对象。很遗憾,这无助于解决错误。

错误Out of memory Exception发生在行:

_mPhoto = android.provider.MediaStore.Images.Media.getBitmap(cr, _mUri);

最佳答案

你不应该创建一个位图并在没有保留它的引用的情况下使用它,因为你必须释放它以获得良好的内存管理。

你做什么:

_mPhoto = Bitmap.createScaledBitmap(
BitmapFactory.decodeFile(PATH_TO_PHOTO, o),
_mPhoto.getWidth() / scale, _mPhoto.getHeight()
/ scale, false);

不好! ;)

喜欢:

Bitmap temp = BitmapFactory.decodeFile(PATH_TO_PHOTO, o);

_mPhoto = Bitmap.createScaledBitmap(
temp,
_mPhoto.getWidth() / scale, _mPhoto.getHeight()
/ scale, false);

temp.recycle(); //this call is the key ;)

阅读您的代码时请牢记:“创建的每个位图都必须回收,否则它会在某些时候因 OOM 错误而崩溃”。

希望对您有所帮助!

你应该阅读更多关于 android Bitmaps and memory management 的内容以获得完整的理解;)

关于java - 第二次创建位图时内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19765356/

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