camera.previewcallback() 에서 작업을 하고있는데 이미지를 계속 불러오는 작업이에요..
근데 몇초동안은 실행되다가 아래와 같은 에러가 로그켓에 뜨는데 아무래도 메모리 문제인거 같아요..
Logcat..
D/dalvikvm(815):GC freed 132 object / 57608 bytes in 121ms
D/dalvikvm(815):GC freed 176 object / 76704 bytes in 118ms
D/dalvikvm(815):GC freed 184 object / 94272 bytes in 152ms
.
.
.
I/dalvikvm-heap( 815): Clamp target GC heap from 18.000MB to 16.000MB
D/dalvikvm( 815): GC freed 171 objects / 29408 bytes in 180ms
I/dalvikvm-heap( 815): Clamp target GC heap from 16.017MB to 16.000MB
I/dalvikvm-heap( 815): Grow heap (frag case) to 16.000MB for 17136-byte allocat
ion
.
.
.
이런 문제가 발생합니다. 콜백함수에서는
mCamera.setPreviewCallback(new PreviewCallback(){
public void onPreviewFrame(byte[] data,Camera camera){
Canvas canvas = null;
try{
canvas = mHolder.lockCanvas(null);
synchronized(mHolder){
try{
try {
decodeYUV420SP(rgb,data,wid,hei); // yuv영상을 rgb로 바꿔주는 함수
bitmap = Bitmap.createBitmap(wid, hei, Bitmap.Config.RGB_565);
bitmap.setPixels(rgb, 0, wid, 0,0,wid,hei);
} catch (Exception e) {
e.printStackTrace();
}
}catch(Exception e){
e.printStackTrace();
}
draw(canvas);
mThread.sleep(2000);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(canvas != null){
mHolder.unlockCanvasAndPost(canvas);
}
}
}
});
이 몇줄 밖에 사용하지 않았습니다.
비트맵이 메모리에 누적이 되서 그런건가요?
어떻게 해결하면 되죠?
당체 문제를 모르겠습니다.....
고수님들의 훌륭한 답변 기다리겠습니다...
긴글 읽어주셔서 감사합니다....(__)
콜백에서 새 비트맵이 왔으면 기존 비트맵을 bitmap.recycle() 하시구요...
만약 카메라에서 찍은 데이터 자체가 상당히 크다면 (예를 들면 갤S 같은 단말의 최대로 찍을수 있는 크기)
비트맵 자체를 저렇게 오는대로 받을게 아니라
내가 보여줄 화면 만큼만 확보하는 방법도 필요할듯 합니다.