* 안드로이드에서 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);
}
});