안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요..리스트뷰를 Thread로 그리는데 랜덤으로 오류가 나서요..
몽키로 돌리다 보면..저런 오류가 뜨더라고요..
그래서 구글링해서 runOnUiThread로도 notifyDataSetChanged()를 해보기도 하고
list를 AllAdd가 아닌 adapter.add()로도 해보고 했는데도 저런 오류가 뜨더라고요..
어떻게 해야 오류가 안날까요??
답변 주심 감사하겠습니다..
03-26 11:08:29.195: E/AndroidRuntime(25595): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131231143, class android.widget.ListView) with Adapter(class com.studitok.asp.nr.store.StoreListAdapter)]
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.widget.ListView.layoutChildren(ListView.java:1567)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.widget.AbsListView.onTouchEvent(AbsListView.java:2322)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.widget.ListView.onTouchEvent(ListView.java:3605)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.view.View.dispatchTouchEvent(View.java:3844)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
03-26 11:08:29.195: E/AndroidRuntime(25595): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1745)
03-26 11:08:29.195: E/AndroidRuntime(25595): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1137)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
03-26 11:08:29.195: E/AndroidRuntime(25595): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1729)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.view.ViewRoot.handleMessage(ViewRoot.java:1810)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.os.Handler.dispatchMessage(Handler.java:99)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.os.Looper.loop(Looper.java:123)
03-26 11:08:29.195: E/AndroidRuntime(25595): at android.app.ActivityThread.main(ActivityThread.java:4632)
03-26 11:08:29.195: E/AndroidRuntime(25595): at java.lang.reflect.Method.invokeNative(Native Method)
03-26 11:08:29.195: E/AndroidRuntime(25595): at java.lang.reflect.Method.invoke(Method.java:521)
03-26 11:08:29.195: E/AndroidRuntime(25595): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
03-26 11:08:29.195: E/AndroidRuntime(25595): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
03-26 11:08:29.195: E/AndroidRuntime(25595): at dalvik.system.NativeStart.main(Native Method)
2012.03.26 13:06:42
저도 며칠 전에 삽질한 내용인데요.http://tigerwoods.tistory.com/26
매우 잘 설명되어있습니다. 근데 저도 앞에서 .post방법을 사용하다가 또 벽에 부딛쳐서
싱크사용해야할 것 같아서 다시 봐야할 것 같아요 ㅠ
오류 내용을 살펴보면 ui를 백그라운드 쓰레드에서 수정하지 말라고 하네요.
제가 알기로도 ui는 쓰레드에서 수정을 하시면 안되는 것으로 알고 있습니다.
백그라운드에서 작업을 하시고 작업 내용에 따라서 ui를 변경 시키실려면 백그라운드 작업에서는 연산 작업만 하시고 연산 작업이 끝난 뒤 연산 결과를 ui를 포함하는 액티비티에 handler와 같은 메시지 전달 방식으로 넘겨주시면 원하시는 결과를 얻을 수 있을 것 같습니다.