2012-10-20 111 views
1

在我的应用程序中使用相机时出现内存问题。我用SurfaceView拍照。在登录猫拍摄照片后,它显示堆内存增长到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

我遇到了同样的问题。你解决了吗?请回复。提前感谢。 – jagdish

+1

我使用此链接提供的技巧解决了它http://developer.android.com/training/displaying-bitmaps/index.html – Aju

+0

感谢您的回复。 – jagdish

回答

1

您应检查您的应用程序的内存分配,请参阅相关的职位here(它也有在年底链接一些伟大的文章)。

0

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

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

+0

我正在释放相机以及摧毁表面......在我的文章中检查更新的代码 – Aju

+0

如果您实际上正在进入surfaceDestroyed方法,您可以放一些日志并查看吗? –

0

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

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

其释放内存位图