[안드로이드 공부]/안드로이드 공부

안드로이드에서 Super를 쓰지 않으면? Wrong state class -- expecting Preference State

코코모아 2015. 9. 11. 09:46

아래는 코모스튜디오가 직접 만든 무료 앱이에요
(한 번만 봐주세요 ^^)

01

02

03

정각알림 만들기(말하는시계)

말하는 시계 (취침, 자전거) 

말하는 타이머 음성 스톱워치 

갑자기 아래와 같은 에러가 뜬다면,

java.lang.IllegalArgumentException: Wrong state class -- expecting Preference State


아무리... 코드를 봐도... 구글링을 해봐도.... 나에게 맞는 처방전을 쉽게 찾기가 거의 불가능에 가깝다.... 원인 조차도.....


1. preference XML 에 같은 ID를 쓰는 놈이 있는지 찾아본다.

2. 동적 코드에서도 같은 ID를 쓰는 놈이 있는지 찾아본다.


여기까지 해서 해결이 안되면,

3. onResume() 을 체크 해본다.

4. 되도록 onResume()에서 refresh()를 구현 해준다.

     --> final ListPreference key = (ListPreference) findPreference(KEY_SETTING);

     key.setOnPreferenceChangeListener(this);

와 같이 다시 불러 와서 세팅해주도록 한다.

5. 그래도 안되면 쓰지 않는 놈을 찾아 본다. 즉, findPreference()가 모두 쓰는 놈들인지 XML로 가서 하나 하나 따져 본다.


이 에러는 기본적으로 액티비티를 다시 띄우는데 기본 값들을 가져와야 하는데, 사라지는 경우에 발생한다. 즉, 최소한 사라지더라도 다시 가져오도록 4번 처럼 refresh를 구현 하거나, save Instance, restore, bundle 등을 활용하여 방어하도록 고려해보는 것이 좋다. 그리고 당연한거지만 static은 쓰지 말자.


6. 아주 기본이지만 overide를 한다면, 

super.onPrepareDialogBuilder(builder);


와 같이 항상 super를 써서 아빠랑 자식이랑 소통의 장을 만들어 주도록 하자.


그렇지 않으면, 할배도, 할매도, 신도.... 소통의 장을 찾지 못해서 이산 가족이 되어 죽어 버릴 수있다.


7. 6 번에 이어 한 번 더 선제적 방어가 필요할 때도 있다.



원래 액티비티 등에서 onSaveInstanceState(), onRestoreInsatanceState() 등을 Override 해서 안드로이드 라이프 사이클에서 새어 나갈 수 있는 값들을 저장하고 다시 불러오는 등의 일을 할 수 있다. 하지만, 메인 액티비티에서 Preference를 Override 한 경우에는 이를 소흘히 하는 경우가 많다. 물론, 구글에서 잘 만들었다면 문제가 발생하지 않을 수도 있지만....


보통 Wrong State 에러는 가로/세로 화면을 전환 하는 경우 많이 발생한다. onDestory 한 뒤에 다시 액티비티 사이클을 타고 올라오다가 액티비티에서 onRestoreInstanctState()를 하다가 Override 한 Preference에서 값을 저장해놓지 않아서 죽어 버리는 경우다. 물론 가로/세로 전환 시 뿐만 아니라, 언제든 죽을 수 있다. 참으로 갑갑한 노릇이다... 노릇 노릇 구워저 가다가.... 새까맣게 타버리는 가슴은... 먹지도 못해요.


특히 MultiselectListPreference에서 문제가 많이 발생한다. 이 경우에는 MultiselectListPreference를 Override 한 곳(X라고 하자)에 가서 위 코드를 삽입 해주면 문제가 해결 된다. 메인 액티비티 Destory 후에 다시 start 하면서 X 소스에 들어갔다가 오는데, 위 코드를 거치면 저장되어있던 값을 가져오기 때문에 메인 액티비티의 onRestoreInsatanceState에서 값을 제대로 가져 올 수 있다. 만약, X에서 위 처럼 저장 해놓지 않는다면 매인 액티비티의 onRestoreInsatanceState에서 가져올 값이(예외처리도) 없기 때문에 죽여 버리게 되는 것이다. (그런데... xml에서 persistent = true로 하면 죽지 않는다.)


좀... 사우지 말고 주기지도 말고 .....가치.... 잘 사라 보자.... 기.


모든 게시물은 코모스튜디오의 소유이며, 무단 복제 수정은 절대 불가입니다.
퍼가실 경우 댓글과 블로그 주소를 남기고 해당 게시물에 출처를 명확히 밝히세요.