先来一段代码看看:
@Override
protected void onDestroy() {
super.onDestroy();
if (mCaptureRequest != null) {
mCaptureRequest.removeTarget(mSurface);
mCaptureRequest = null;
}
if (mSurface != null) {
mSurface.release();
mSurface = null;
}
if (mSurfaceTexture != null){
mSurfaceTexture.release();
mSurfaceTexture = null;
}
if (mCameraCaptureSession != null) {
try {
mCameraCaptureSession.stopRepeating();
mCameraCaptureSession.abortCaptures();
} catch (CameraAccessException e) {
e.printStackTrace();
}
mCameraCaptureSession = null;
}
if (mCameraDevice != null) {
mCameraDevice.close();
mCameraDevice = null;
}
if (mChildHandler != null) {
mChildHandler.removeCallbacksAndMessages(null);
mChildHandler = null;
}
if (mHandlerThread != null) {
mHandlerThread.quitSafely();
mHandlerThread = null;
}
mCameraManager = null;
mSessionStateCallback = null;
mSessionCaptureCallback = null;
mStateCallback = null;
}
从上面的代码中可以看出,在destroy时,需要关闭相机相关的资源,并且一定要注意关闭的顺序,如果处理不当就面临的麻烦可能就是内存泄露,注意要释放的资源,否则一直持有会导致内存泄露.
一般情况下会有以下几个操作导致内存泄露:
- CaptureRequest 如果没有释放Surface, 一定操作释放 mCaptureRequest.removeTarget(mSurface);
- SurfaceTexture 需要被释放,除了 mSurfaceTexture.release();
也可以用这种mTextureView.getSurfaceTextureListener().onSurfaceTextureDestroyed(mTextureView.getSurfaceTexture());方式释放SurfaceTextur,但是在上面的public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) 回调中你需要返回true或者自己执行 surface.release(); 这样才会运行onSurfaceTextureDestroyed回调 - Surface 需要被释放
- 释放是需要按顺序一个一个释放的
- 如果你想实现一个工具类来以建造者模式来创建相机拍照,请注意TextureView不能传入工具类里,因为你需要实现setSurfaceTextureListener监听,而这个监听你是无法在工具类里释放它的,它是需要在activity里才能被释放,请切记!
你最好只传入SurfaceTexture给工具类