origoni's Blog from Millky

origoni의 스프링 블로그 입니다.

Android 새로운 스레드를 이용하여 UI를 변경시 에러 발생시


이번에 스타펫 위젯에 퍼트리기 기능을 추가 하였다.

트위터와 페이스북을 추가 했는데.

퍼트리기를 하고나면 해당 레어펫을 바로 사용할 수 있도록 만들었다.


트위터와 페이스북 모두 API가 잘 만들어저 있어서

인증 및 글쓰기 등은 그렇게 어렵지 않게 진행할 수 있었다.


사실 기능이 다 완료되고 내폰(갤럭시 넥서스)에서는 모든 기능이 잘 동작하였다.


다 완료되었다고 생각하고 배포판을 만들었는데..

아 이런... ICS에서는 잘 동작하는데..

그 아래 버전에서는 다음과 같은 에러가 나는 것이었다.


Only the original thread that created a view hierarchy can touch its views.


아이 정말 ㅠㅠ


그래서 찾아보니 아래와 같은 글들이 있었다.


참고자료

요청 : http://www.androidpub.com/32805

응답 : http://binsolb.tistory.com/entry/CalledFromWrongThreadException

감사합니다.


원인은 트위터 API에서 새로운 스레드를 이용하여 UI를 변경시키려 해서 발생하는 것 이었다.

그런데 ICS에서는 동적으로 변경하는 부분에 대해서 해결이 된 것인지 이상없이 동작을 하였고 하위버전에서 문제가 발생하는 것이었다. (역시 테스트 잘 하고 올려야 한다.)


위에 참고 글들을 보면 되겠지만 간단하게 적어본다면

아래와 같이 핸들러를 만들어서 해결 할 수있다.



1. 내가 동적으로 UI를 변경하려 했던 부분을 아래와 같은 코드로 변경한다.

new Thread()

{

public void run()

{

Message msg = handler.obtainMessage();

handler.sendMessage(msg);

}

}.start();


2. 핸들러를 만든다.

final Handler handler = new Handler()

{

public void handleMessage(Message msg)

{

// 원래 하고싶었던 일들 (UI변경작업 등...)

}

};


크 안드로이드 책 한권 사서 봐야지...

그래도 역시 자바기반이고 뭔가 J2EE와 비슷한 아키텍처를 가지고 있어서 쉽게 적응 가능하다.

재미있는 안드로이드 프로그래밍 이지만... 기종별 테스트 잘 해야겠다;;;




back to top