Mobile-하이브리드앱

CalledFromWrongThreadException: only the original thread that created a view hierarchy can touch its views. 오류대처법

무한열정 2016. 9. 10. 10:33

* 안드로이드에서 UI에 접근하여 처리하고자 할때 다음과 같은 오류가 발생할 때가 있다.

  특이하게 하위버전 예를들면 진저브레이드에서는 오류가 없다.

  이유는 ICS이상에서 UI제어의 경우 Main Thread에서 처리 하도록 바뀌었기 때문이다.

  그 이유는 사용자의 사용성이 나빠질수 있기 때문인데 메인 쓰레드가 아닌곳에서 UI를 처리하면 사용가 느끼기에 앱이 먹통이된 것처럼 보일수 있기 때문에 앱의 품질을위해서 구글이 처리방식을 변경하였다..


* 만약 이 규칙을 지키지 않으면 다음과 같은 메시지가 날수 있다..

09-08 13:59:55.836: W/System.err(12501): android.view.ViewRootImpl$CalledFromWrongThreadException: only the original thread that created a view hierarchy can touch its views.

09-08 13:59:55.836: W/System.err(12501): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6556)

09-08 13:59:55.836: W/System.err(12501): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:942)

09-08 13:59:55.836: W/System.err(12501): at android.view.ViewGroup.invalidateChild(ViewGroup.java:5081)


* 가장 간단하게 처리할수 있는 방법은 다음과 같이 추가 수정을 한다.

  activity 클래스 자체가 메인쓰레드를 처리할수 있는 메소드를 내장하고 있어 이걸 쓰는게 가장 간단하다. ^^

    activity.runOnUiThread(new Runnable() {

            public void run() {

        Intent intent = new Intent(activity,

        ContactListActivity.class)

        .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP

        | Intent.FLAG_ACTIVITY_SINGLE_TOP);

        

            activity.startActivityForResult(intent, 10001);

            }


     });