간혹 어플을 만들고 나면 logcat 에서 다음과 같은 error 문구가 발생 하는 걸 볼 수 있다.

04-18 07:59:04.280: ERROR/Cursor(31526): Finalizing a Cursor that has not been deactivated or closed. 
 

(없으면 말고~) 위에 저 에러는 내가 발생 시킨건 아니고 어디서 퍼온거임.

여튼 이런 에러의 원인을 설명 해보자면 (나도 확실히 아는건 아님)
정확히 버전은 기억이 안나지만 아마 Froyo 부터 일듯 싶음.

Android 2.2 부터 Cursor 객체에 대한 GC를 보장 하지 않기 때문인 듯 사료됨.
무슨 뜻인고 하니 JAVA는 사용하다가 안쓰는 객체는 V 머신에서 free를 해주는 방법을 취하고 있는데.
정상 적이라면 android도 java니깐 dalvik 에서 우리가 안쓰는 객체를 free 하는 작업을 해주고 있는 거임.

근데 Cursor 객체는 지금 당장 사용 중이 아니라도 뭔가 목적을 위해 일부로 열어 둔것 일 수 도 있으니 dalvik 에서 인위 적으로 free 안해주겠다는 것임.
이렇게 되면 Activity는 끝났는데 cursor만 안끝나는 경우가 생김. 그러면 어케 되냐면 cursor 하나 때문에 activity 전체가 종료가 안되는 경우가 발생 할 수 있음 (순전히 내생각...)

그래서 따로 Cursor에 대해서 close 해달라고 난리 치는거임. 후훗~

일반적으로 cursor는 그냥 cursor.close() 이걸로 해결 되는데
문제는 ListView에 연결해 놓은 cursor 들임...
대부분 CursorAdapter 라던지 뭐 이런 것들로 처리를 했을 텐데.
close() 시키는 방법은 Activity라면 onDestroy() 가 적당 할 것임. (종료 하는 부분이 좋음)
무튼 onDestroy() 함수에다가 CursorAdapter 라던지 ListView라던지 객체를 얻어서 보통은
mList.getAdapter().getCursor().close(); 이러던가, mAdapter.getCursor().close();
이런식으로 종료를 처리함.

굉장히 허접하지만... 후훗~ 

'Android' 카테고리의 다른 글

Android Study ListView Indexer 1편  (0) 2012.03.07
LayoutInflater에 대하여...  (0) 2012.02.15
Android database 만들기 7편  (0) 2012.02.10
Android database 만들기 6편  (0) 2012.02.10
Android database 만들기 5편  (0) 2012.02.10

+ Recent posts