2013. 4. 12. 01:04

안드로이드의 쓰레드(Thread)와 핸들러(Handler)

어떤 동작을 하기 전과 한 후의 처리를 해줄때 짧지만 일정 시간을 지연시키고자 할 경우가 있습니다. 그럴때 쓰레드를 써서 sleep() 메써드를 이용하면 간단히 될 것 같아서 아래처럼 코딩을 했을때 에러는 안 나지만 원하는 결과가 나오지 않습니다. 그냥 시간만 3초 정도 지나서 맨 마지막 문장만 출력됩니다. 중간 과정이 생략되는 것이죠.

그래서, 이걸 좀 바꿔 쓰레드 클래스를 별도로 만들어 주고, 거기에서 run() 메써드 안에 처리할 코드를 입력합니다. 이럴려면, 쓰레드의 인스턴스가 생성되어 있어야 하고, 이걸 시작시켜 주는 명령도 있어야겠죠.

그런데, 이렇게 해서 실행을 하면 어떻게 될까요? 안드로이드는 그냥 뻗어버립니다. Sorry~ 와 함께. 이건 안드로이드가 자동으로 처리하는 메인 쓰레드와 임의로 만들어준 MyThread라는 추가된 쓰레드 코드 안에 있는 textView 위젯에 대한 동시접근의 문제 때문에 그렇습니다.

 

 

이걸 해결하는 방법이 핸들러(Handler)를 이용하는 겁니다.

이것도 쓰레드처럼 인스턴스를 생성해야 되겠죠.

임포트는 android.os.Handler를 선택해 주고요.

 

 

이렇게 하면 textView 위젯에 직접 접근을 할 수 있습니다.

처리는 쓰레드의 run() 메써드 안에서 다음과 같이 합니다.

몇 단계를 생략했지만 오히려 골치가 안 아픔.

 

sendText() 메써드를 하나 만들어서 handle.post()로 직접

처리해주는게 제일 간단하고 편한 방법입니다.

 

 

이제 더 이상 뻗어버리는 현상없이 일단 실행은 됩니다.

그런데, 여전히 동작은 바라던대로 되지 않습니다.

 

모든 동작이 한꺼번에 동시적으로 실행을 하니까

결과가 나온 다음 주사위를 던졌습니다 . . . 가

가리늦게 출력이 되면서 뒷북을 치고 있습니다.

 

 

그러니까 주사위를 던졌습니다 . . 가 1초 간격을 두고,

표시된 후에 주사위 이미지와 ''결과가 나왔습니다''를

출력하고 싶다 이거죠.

 

이것도 역시 핸들러로 해결합니다. 자바에서는 쓰레드만

알면 되지만 안드로이드에서는 쓰레드에 더해서 이

핸들러까지 필수적으로 알아야 합니다. 이를 통해 작업

스케줄링을 할 수 있게 되죠.

 

핸들러를 하나 클래스로 추가해 만들고, 그 이름을 MyHandler라고 합니다.

쓰레드 run() 메써드 안에서 myHandler.sendEmptyMessage(0) ;를 추가하고,

새로 만든 핸들러 클래서 안에 있는 handleMessage(Message msg) 메써드

안에 쓰레드 실행 후 처리될 코드를 입력하면 작업은 끝입니다.

 

이제 최종 실행을 해보면, 처음에는 주사위가 보이지 않습니다.

 

 

버튼을 누르면 시도 횟수에 1이 나오면서

주사위를 던졌습니다 . . 가 2초 동안 표시됩니다.

 

 

그 다음 두 개의 주사위와 결과가 나왔다는 문자열이 나옵니다.