在我的应用中使用相机时出现内存问题。我用SurfaceView拍照。在log cat中拍摄照片后,显示堆内存增长到30 mb,有时也增加到40mb。因为有些时候应用程序也崩溃了“OutofMemoryException”。在这里,我提供我的代码。请帮帮我。
surfaceView = (SurfaceView) findViewById(R.id.camerapreview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
capture.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View arg0) {
camera.takePicture(myShutterCallback, myPictureCallback_RAW,
myPictureCallback_JPG);
capture.setClickable(false);
}
});
PictureCallback myPictureCallback_RAW = new PictureCallback() {
@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
System.out.println("myPictureCallback_RAW");
}
};
PictureCallback myPictureCallback_JPG = new PictureCallback() {
@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
try {
bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0,
arg0.length);
}
catch (OutOfMemoryError e) {
Toast.makeText(FromCamera.this, "Please try again",
Toast.LENGTH_SHORT).show();
}catch (Exception e) {
Toast.makeText(FromCamera.this, "Please try again",
Toast.LENGTH_SHORT).show();
}
capture.setEnabled(false);
buttonBack.setVisibility(View.VISIBLE);
buttonDone.setVisibility(View.VISIBLE);
buttonBack.setEnabled(true);
buttonDone.setEnabled(true);
}
};
ShutterCallback myShutterCallback = new ShutterCallback() {
@Override
public void onShutter() {
System.out.println("onShutter");
}
};
我已经尝试过强制垃圾收集,但仍然没用。
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.stopPreview();
camera.release();
camera = null;
}
previewing = false;
}
答案 0 :(得分:1)
您应该检查应用的内存分配,查看相关帖子here(最后还有一些很棒的文章链接)。
答案 1 :(得分:0)
使用后是否正在释放相机?完成拍照后,尝试使用camera.release()释放相机,然后再次评估内存使用情况。
你可以尝试的另一件事是在你使用它之后破坏表面,看看它是否有帮助。
答案 2 :(得分:0)
当您处理Bitmap时,垃圾收集器可能会失败一段时间......当您不使用位图时,请确保释放位图内存
if(!mBitmap.isRecycled())
mBitmap.recycle();
释放位图内存