使用相机拍照后,堆内存增长更多

时间:2012-10-20 09:41:41

标签: android memory-leaks out-of-memory heap-memory

在我的应用中使用相机时出现内存问题。我用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;
}

3 个答案:

答案 0 :(得分:1)

您应该检查应用的内存分配,查看相关帖子here(最后还有一些很棒的文章链接)。

答案 1 :(得分:0)

使用后是否正在释放相机?完成拍照后,尝试使用camera.release()释放相机,然后再次评估内存使用情况。

你可以尝试的另一件事是在你使用它之后破坏表面,看看它是否有帮助。

答案 2 :(得分:0)

当您处理Bitmap时,垃圾收集器可能会失败一段时间......当您不使用位图时,请确保释放位图内存

if(!mBitmap.isRecycled())
mBitmap.recycle();

释放位图内存