본문 바로가기

ANDROID의 속삭임

[android][OBJECT][Handler]Handler 사용하기.

※ Handler를 사용 하는 이유는?

- 핸들러를 사용하는 이유는 쓰레드간의 통신을 위해서 이다.

- 쓰레드간에는 서로의 간섭을 할수 없다. 

- 안드로이드에서는 작업 지연시간이 5초를 초과 할수 없다. 그래서 시간이 오래 걸리는 작업은 쓰레드를 통해 동작하는데 문제는 해당 쓰레드에서 UI조작이 필요 할때다. 안드로이드는 엄연히 UI기반이다. 입력을 받는 출력을 하던 UI가 필요하다. 그렇기 때문에 별개 쓰레드에서는 UI에 접근 하는 방법이 필요 한데 이것을 Handler가 대신 해준다.



※ Handler 메소드

- public void Handler.handleMessage(Message msg) : Looper가 Message Queue에서 Message하나를 꺼내 이 함수에 전달 해줍니다.

boolean Handler.sendEmptyMessage (int what) : 

- boolean Handler.sendMessage (Message msg)

- boolean Handler.sendMessageAtFrontOfQueue (Message msg)

- boolean Handler.sendMessageAtTime (Message msg, long uptimeMillis)

- 절대시간에 Message 전달

- boolean Handler.sendMessageDelayed (Message msg, long delayMillis)

- 경과시간 후 Message 전달

- boolean Handler.postAtTime (Runnable r, long uptimeMillis)

- boolean Handler.postDelayed (Runnable r, long delayMillis)

- boolean Handler.post (Runnable action)

- boolean Handler.postDelayed (Runnable action, long delayMillis)





※ Message 관련(핸들러에 전달되는 데이터의 형태).

- Thead는 핸들러에게 메세지를 생성하여 전달 합니다.

Message msg = new Message();

msg.setTarget(핸들러 렌퍼런스변수);

msg.sendToTarget(); //이렇게 하면 메세지가 핸들러에게 전달됩니다.


※ Message 필드

- public int arg1 : int형의 데이터를 저장.(핸들러로 보낼 데이터를 저장 한다)

- public int arg2 : int형의 데이터를 저장.(핸들러로 보낼 데이터를 저장 한다)

- public Object obj : 오브젝트 저장. (핸들러로 보낼 데이터를 저장 한다) 

- public Messenger replyTo : 다른 프로세스에서 돌고 있는 서비스와 통신할때는 메신저를 이용한다. 그럴때 사용한다.

- public int what : 프로그래머가 해당 데이터를 구분하기 위해 사용한다.



※ 내용 정리 

- 대략 아래와 같이 사용하면 된다.

- 아래 예제는 Thread를 생성하지만, Android는 AsyncTask라는 클래스가 있다. 그게 훨신 편하다. 그것은 자체적으로 핸들러와 비슷한 기능을 하는 메소드또한 지원한다. 즉 AsyncTask를 사용한다면 Handler의 사용은 선택이 된다.

...생략...


public class MainActivity extends Activity {



public Handler myHandler = new Handler() {

public void handleMessage(Message msg) {

MyDataObject myDataObject = msg.obj;

...전달 받은 데이터로 UI조작...

}

};

...생략...

    new Thread(new Runnable() {

        public void run() {

Message msg = new Message();

msg.setTarget(myHandler);

msg.obj = myDataObject;

msg.sendToTarget();

        }

    }).start();

...생략...


}