MainActivity 에서 Thread 를 돌려 변경되는 작업들을 다시 MainActivity 에서 참조하여 UI를 변경하고 싶을 때,
MainActivity 에 update() 를 두고 MainActivity 를 넘기게 되면 디버깅시에는 잘 동작하는 것이 실제로 동작 시키면 잘 안되는 현상이 일어난다.
이는 UI Thread는 외부 Thread 에서 참조할 수가 없기 때문에 일어나는 현상이다.
이를 해결 하기 위해서 Handler 라는 개념을 사용 하게 된다.
(C# 에서는 델리게이트라는 위임의 역할을 맡아주는 것이 따로 있다.)
핸들러란?
시스템은 사용자가 작성한 UI에서 빠른 응답을 요구하고 있다.
만약 이상의 응당이 없을 경우 최악의 경우 작성된 프로그램이 강제로 종료가 경우도 발생할 수 있다.
이런 상황을 방지하기 위해서 오래걸리는 작업이 필요한 경우 두가지의 방법으로 해결을 할 수 있다.
첫번째는 시간이 오래걸리는 작업은 서비스로 만들어서 처리하는 방법
새로운 쓰레드로 처리를 하는 방법
두번째 방법으로 생성해서 데이터 처리등의 시간이 오래걸리는 작업을 지원하기 위한 클래스가 존재하는데 핸들러(Handdler)이다.
간략하게 요약을 해보면
- 백그라운드 생성을 위한 가장 유연한 방법이다.
- 인스턴스 생성시 자동으로 안드로이드가 관리한다.
- 메시지를 전달받게 되면 호출 되는 handlerMessage()에 실제 처리내용을
- post(), postDelayed()를 통해서 인자로 실행하고 자하는 Runnable객체를 전달할 수 있다.
- View단에도 Runnable객처를 인자로 전달가능하고 이럴경우 코드가 심플해지는 경우도 있지만 Handler를 추천한다.
메시지(Message)란?
UI등에서 실제로 처리를 담당하는 데이터를 전송하거나 작업을 요청하기 위해서 전달하는 객체이다.
- 핸들러로 전달되는 객체이다.
- 전달된 메시지는 메시지 Queue를 통해서 핸들러가 사용한다.
- 메시지를 전달하기 위해선 핸들러의 obtainMessage()호출해서 메시지 풀의 메시지를 전달해야한다.
- 메시지를 전달하기 위해서는 sendMessage() 등을 사용한다.
메시지 전달 방식의 종류
- sendMessage() - 큐의 메시지를 삽입한다.
- sendMessageAtFrontQueue() - 큐의 맨앞에 메시지를 삽입한다.(우선처리)
- - 장비기동시간을 기준으로 삽입한다.(SystemClock.uptimeMillis()참고)
- sendMessageDelayed() - 특정시간만큼 지연 삽입한다.
'Android_Programma' 카테고리의 다른 글
[ Android ] 좀 쉽게 만든 JAVA JSON parsor CLASS (0) | 2012.07.26 |
---|---|
[ Android , Java ] IOCP client 구현 (0) | 2012.07.26 |
[ Android ] Json 방식으로 묶기. (0) | 2012.07.18 |
[android] 영상처리 NDK 단에서 처리하여 리턴하기 (Image Processing in NDK) (5) | 2012.07.10 |
[android] [펌] SurfaceView 의 이해와 CameraView 띄우기 (0) | 2012.07.09 |