스토리
A다이알로그에 이미지 리스트를 보여주는 기능이 있었다. 그런데 이상하게도 정상적으로 화면에 보여질 때가 있는 반면, 'Shutting down VM' 이라는 무책임한 Log와 함께 앱이 죽어버리는 경우가 발생하고 있었다. 또한 앱은 키 입력 등, 모든 Event를 처리하지 못하고 있었다. 그리고 그 키 입력 처리를 못하므로써 ANR이 뒤 늦게 발생했다. 이러한 현상이 발생하는 이유를 알 수 가 없었고, 점점 오리무중으로 빠지고 있었다.
버그 원인
버그의 원인은 Context 타입의 ContextThemeWrapper를 Activity로 변환하면서 발생하는 오류였습니다. 이유는 알 수 없지만, Exception이 발생하지 않고 단순히 'Shutting down VM' 이라는 Log만 찍혔습니다. 이 실수는 일반적으로 저지르는 경우는 없지만, 만약 저지르면 쉽게 찾기가 힘들어 보입니다. 한번 간략히 적어봅니다.
1. Dialog를 생성할 때 Activity 객체를 넘긴다.
2. 해당 Dialog에서 getContext()로 Context를 얻는다.
3. 얻은 Context를 Activity로 타입캐스팅한다.
위의 동작은 문제될 것 같아 보이지 않지만, Dialog의 getContext()를 통해 얻으면 ContextThemeWrapper 객체를 얻어옵니다. Activity 객체가 아니지요. 그래서 발생한 오류였는데.. 상당한 시간을 드려서 찾게되네요. 구현하는 과정에서 찾는 거였다면, 어쩌면 빠르시간에 찾았을지 모르지만, 버그 픽스 등으로 시간이 지난 후 버그로 찾으니 오랜 시간이 걸렸습니다.
버그 해결
Dialog의 getContext()를 사용하지 않고 직접 Context를 관리했습니다. 그래서 getContext() 대신 mContext를 사용했습니다.
⊙ 'Shutting down VM'이 로그에 찍히면, 타입캐스팅도 의심해 볼 만 합니다.
⊙ Dialog의 생성자로 넘겨준 Context와 Dialog::getContext()는 다를 수 있습니다.
'안드로이드' 카테고리의 다른 글
[안드로이드] Dialog.dismiss()를 할 때, java.lang.IllegalArgumentException: View not attached to window manager 예외 회피하기 (2) | 2013.03.08 |
---|---|
[안드로이드] Collection을 사용 할 때 ConcurrentModificationException을 피하는 방법 (0) | 2013.03.06 |
[안드로이드] APK 파일 SIGN 하기 (0) | 2012.10.29 |
안드로이드 ListView와 Thread를 사용할 때 동기화 오류 (IllegalStateException) (0) | 2012.10.08 |
[안드로이드] uncaught exception 사용하기 (UncaughtExceptionHandler) (0) | 2012.10.02 |
[안드로이드] ListView의 fadingEdge 없애는 방법 (0) | 2012.09.26 |
[안드로이드] /system 디렉토리 remount 하기 (0) | 2012.09.19 |
[안드로이드] 텍스트 파일의 캐릭터 셋(Character Set) 얻기 (0) | 2012.09.04 |
[안드로이드] 이클립스 업데이트 오류 (Install download0) (0) | 2012.07.27 |
[안드로이드] AIDL에 Parcelable 데이터 사용하기 (2) | 2012.07.04 |