안드로이드 개발 질문/답변
(글 수 45,052)
Bitmap rotate_Image = Bitmap.createBitmap(ret_Image, (int)x,(int)y, (int)cutSizeX, (int)cutSizeY, m, false); ret_Image.recycle(); ret_Image=null; Bitmap scale_Image = Bitmap.createScaledBitmap(rotate_Image, outputX, outputY, false); rotate_Image.recycle(); rotate_Image = null;
위처럼 코드를 짜고있습니다.
근데 간혹 3번째 줄에서 rotate_Image가 이미 recycle 됬다며, 오류가 발생하네요..
다른곳 다 찾아봐도 rotate_Image를 리사이클 해준곳은 없습니다. 보시다시피 위에서 선언하고 사용하고 바로 recycle시키는거라서요...
왜 이런건지 아시는분 조언 부탁드립니다!
2013.01.16 16:28:14
ret_Image는 바로위에서 생성합니다.
Bitmap ret_Image = BitmapFactory.decodeFile(imagePath, options);
그러면... 저게 recycle이 되면 안되는 상황인데 recycle이 되어버리면... 아래 처럼 해도 될런지요 ?
Bitmap rotate_Image = Bitmap.createBitmap(ret_Image, (int)x,(int)y, (int)cutSizeX, (int)cutSizeY, m, false);
ret_Image.recycle(); ret_Image=null;
if(rotate_Image.isRecycled()){
rotate_Image = Bitmap.createBitmap(ret_Image, (int)x,(int)y, (int)cutSizeX, (int)cutSizeY, m, false);
}
Bitmap scale_Image = Bitmap.createScaledBitmap(rotate_Image, outputX, outputY, false);
이렇게 해도 되나요??
2013.01.16 16:58:41
아하
public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
Returns an immutable bitmap from subset of the source bitmap
도큐먼트에 나온대로 pixel 데이터를 원본 비트맵의 것을 참조하여 Bitmap 객체를 만드네요. 그러니 ret_image.recycle() 하는 순간에 rotate_Image 객체의 pixel 데이터도 recycle 되는것같습니다.
그러므로.. 중간에 recycle 하지 마시고 최종 산출된 bitmap이 사용이 끝나면 그때 한번만 하면 될것 같아요.




ret_image가 만들어진 부분은 어디이면 위에 첨부하신 코드로 오기 전에 어떠한 처리가 이루어지는지 확인이 필요한 것 같네요.
일단 예외처리를 위해서는 bitmap.isRecycled로 분기 처리하 실 수 있어요.