코드에러 - [SurfaceView - ... ]cancelBuffer: BufferQueue has been abandoned
*SurfaceView 사용에러: cancelBuffer: BufferQueue has been abandoned
"BufferQueue has been abandoned" 오류는 SurfaceView와 관련된 문제로 보입니다. SurfaceView는 안드로이드의 그래픽 API 중 하나로, 화면을 그리는 데 사용됩니다.
해당 오류는 SurfaceView에서 사용하는 BufferQueue가 파기되어서 발생하는 것으로 보입니다. 이 오류를 해결하는 방법으로는 다음과 같은 것들이 있습니다:
-SurfaceView를 사용하는 Activity나 Fragment가 종료될 때, SurfaceView의 모든 리소스를 제거하도록 onDestroy() 메서드에서 코드를 작성합니다. SurfaceView가 더 이상 필요하지 않을 때 명시적으로 SurfaceView를 제거해주는 것이 중요합니다.
-(적용)SurfaceView의 콜백 메서드인 surfaceDestroyed()에서 SurfaceView와 관련된 객체들을 모두 정리합니다. surfaceDestroyed() 메서드는 SurfaceView가 종료될 때 호출됩니다.
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 카메라 객체 정리
if (mCamera != null) {
mCamera.stopPreview();
mCamera.setPreviewCallback(null);
mCamera.release();
mCamera = null;
}
// SurfaceView 관련 객체 정리
holder.removeCallback(this);
}
위 코드에서 mCamera는 카메라 객체를 참조하는 변수이며, SurfaceHolder는 SurfaceView에서 화면을 그리기 위한 Holder 객체입니다. removeCallback() 메서드는 SurfaceHolder의 콜백 메서드를 제거합니다.
위 코드는 SurfaceView가 종료될 때 카메라 객체를 정리하고, SurfaceView와 관련된 객체를 모두 정리합니다. 이를 통해 "BufferQueue has been abandoned" 오류를 해결할 수 있습니다.
--실제 코드 적용 시 class MyApplication extends Application에서 앱 시작과 동시에 카메라가 켜지도록 설정했기 때문에 mCamera.release(); 와 mCamera = null; 코드를 사용하지 않음
-SurfaceView를 사용하기 전에 SurfaceHolder.Callback을 등록하고, surfaceChanged() 콜백 메서드에서 화면의 크기를 조정하고 BufferQueue를 재설정합니다.
-최신 버전의 OpenCV를 사용하는 경우, 카메라와 관련된 버그를 해결하기 위해 다음과 같은 코드를 추가해볼 수도 있습니다.
아래 코드는 카메라 미리보기에서 사용하는 콜백을 제거하고, 카메라 객체를 제거하여 문제를 해결할 수 있습니다.
mCamera.setPreviewCallbackWithBuffer(null);
mCamera.setPreviewCallback(null);