마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Wifi때는 잘되는데 4G를 이용하면 안되네요...

0 추천
try {     
      adapter.notifyDataSetChanged();  
      Log.d("TRY CALL","TRY");
     } catch (final Error e) {    
      Log.d("ERORR1","ERROR1");
     } catch (final IllegalStateException e){      Log.d("ERORR2","ERROR2");
     } catch (final RuntimeException e) {                                                                    Log.d("ERORR3","ERROR3"); e.printStackTrace();
     } catch (final Throwable e) {      Log.d("ERORR4","ERROR4");
   
     }

DB에 접근해서 데이터를 가지고온뒤 리스트뷰를 add한뒤에 위와같은 예외처리를 해주었는데요..

wifi로 할때는 예외처리가 안걸리는데 4G로하면 catch (final RuntimeException e) 예외처리가 걸리네요 ㅠㅠㅠ왜그런거죠?

e.printStackTrace()의 결과는 밑에 처럼나옵니다..

10-03 09:41:22.087: W/System.err(30914): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
10-03 09:41:22.087: W/System.err(30914):  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4919)
10-03 09:41:22.087: W/System.err(30914):  at android.view.ViewRootImpl.focusableViewAvailable(ViewRootImpl.java:2708)
10-03 09:41:22.087: W/System.err(30914):  at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:609)
10-03 09:41:22.087: W/System.err(30914):  at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:609)
10-03 09:41:22.087: W/System.err(30914):  at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:609)
10-03 09:41:22.087: W/System.err(30914):  at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:609)
10-03 09:41:22.087: W/System.err(30914):  at android.view.View.setFlags(View.java:8567)
10-03 09:41:22.087: W/System.err(30914):  at android.view.View.setFocusableInTouchMode(View.java:5725)
10-03 09:41:22.092: W/System.err(30914):  at android.widget.AdapterView.checkFocus(AdapterView.java:717)
10-03 09:41:22.092: W/System.err(30914):  at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:812)
10-03 09:41:22.092: W/System.err(30914):  at android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:6720)
10-03 09:41:22.092: W/System.err(30914):  at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
10-03 09:41:22.092: W/System.err(30914):  at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
10-03 09:41:22.092: W/System.err(30914):  at android.widget.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:286)
10-03 09:41:22.092: W/System.err(30914):  at com.example.kitchenapp.OpenActivity.showData(OpenActivity.java:317)
10-03 09:41:22.092: W/System.err(30914):  at com.example.kitchenapp.OpenActivity$showDB.doInBackground(OpenActivity.java:151)
10-03 09:41:22.092: W/System.err(30914):  at com.example.kitchenapp.OpenActivity$showDB.doInBackground(OpenActivity.java:1)
10-03 09:41:22.092: W/System.err(30914):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-03 09:41:22.092: W/System.err(30914):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-03 09:41:22.092: W/System.err(30914):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-03 09:41:22.092: W/System.err(30914):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-03 09:41:22.092: W/System.err(30914):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-03 09:41:22.092: W/System.err(30914):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-03 09:41:22.092: W/System.err(30914):  at java.lang.Thread.run(Thread.java:856)
닉스리 (410 포인트) 님이 2013년 10월 3일 질문

1개의 답변

0 추천
 
채택된 답변

adapter.notifyDataSetChanged();   는 ui thread 에서 수행하십시오.

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

(이 에러가 그런 이야기를 해주는거라고 이해하시면 됩니다. )

상인 (6,670 포인트) 님이 2013년 10월 3일 답변
닉스리님이 2013년 10월 4일 채택됨
감사합니다^^ 그런데요.. 제가 DB를 사용하면서 doInBackground(Void... params)  이란걸 쓰는데요.. 이걸쓰면 UI Thread쓰면 프로그램이 바로 죽어버리더라고요 ㅠㅠ 다른방법 없을까요??
AsyncTask 나 Handler 로 컨트롤 하세요.
계속 질문드려서 죄송합니다.. ㅠㅠAsyncTask 나 Handler 로 adapter.notifyDataSetChanged();   이거를 수행하라는 말씀이세요??
Async 이용하시려면 doInBackground는 스레드라서 안되고 onPostExecute에서 ui처리 해주세요
그냥 스레드 쓰시려면 스레드 처리후에 handler로 보내서 ui작업 해주시면 됩니다.
...