1

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

3 回答 3

1

您应该检查您的应用程序的内存分配,请参阅此处的相关帖子(最后还链接了一些很棒的文章)。

于 2012-10-20T09:49:23.210 回答
0

使用后你会释放你的相机吗?完成拍照后,尝试使用 camera.release() 释放相机,并再次评估内存使用情况。

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

于 2012-10-20T09:57:12.973 回答
0

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

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

释放位图内存

于 2012-10-20T10:09:31.060 回答