상세 컨텐츠

본문 제목

[Android]핸들러 클래스

Android 개발

by mobile 2013. 9. 19. 19:45

본문

반응형

자바에서 제공하는 핸들러는 java.util.logging.Handler 클래스에서 제공된다. 자바의 핸들러는 안드로이드의 android.util.Log 클래스와 유사하게 로그와 관련된 메시지를 처리하는 것으로 되어 있다. 여기서 이야기하는 Handler 클래스와 유사하게 로그와 관련된 메시지를 처리하는 것으로 되어 있다. 여기서 이야기하는 Handler 클래스는 자바 핸드러와 기능 자체가 전혀 다르고 또한 안드로이드 운영체계와 관련된 android.os 패키지에서 제공한다.


핸들러는 스레드와의 상화 작용하는 클래스로 안드로이드에서 제공하는 메시지큐(Message Queue)와 일대일로 대응된다.

- 메시지는 핸들러의 obtainMessage() 메서드를 호출해서 시스템에서 관리하는 메시지큐로부터 메시지를 획득 한다.

- 일반 스레드는 작업 요청을 위해 sendMessage() 또는 postRunnable() 메서드를 이용하여 메시지 또는 Runnable 객체를 메시지 큐에 보내는 방식으로 작업을 요청한다.

- 안드로이드는 일반 스레드가 보낸 메시지를 핸들러의 handleMessage() 메서드로 보내어 메시지의 내용을 읽어 요청한 작업을 수행한다. 그리고 Runnable 객체는 안드로이드에서 직접 처리한다.


obtainMessage()메서드는 두가지 기능을 수행한다.

- 같은 메시지가 메시지큐에 계속 쌓여지는 것을 방지하는 기능을 갖는다. 즉, 같은 작업을 요청하는 메시지는 메시지큐내 하나만 존재하게 한다.

- 만약 메시지큐에 같은 메시지가 없다면 메시지를 생성하는 Message.obtain() 메서드를 대신하여 새로운 메시지를 생성하여 반환한다.


obtainMessage() 메서드를 호출하면 먼저 메시큐내 같은 메시지가 존재하는지 조사하게 된다. 만약 이미 같은 메시지가 존재한다면 메시지를 메시지큐에서 삭제하고 이 메시지를 반환한다. 메시지큐내 같은 메시지가 존재하는지 여부는 public final boolean hasMessage(int what, Object object)메서드를 사용하여 알 수 있다. 만약 존재한다면 true를 반환한다.


Message 클래스는 아래와 같은 필드를 갖고 있다.

- public int what : 사용자가 정의하는 메시지 코드이다. 핸들러는 메시지 코드를 보고 어떤 작업을 할지 판단하게 된다.

- public int arg1 과 public int arg2 : 사용자가 내부적으로 사용하기 위한 값을 보관하는 필드이다.

- public Object obj : 문자열이나 스레드 객채를 저장하는 필드이다.

- public Messenger replyTo : 핸들러를 이용하는 메신저를 가리킬 때 사용한다.


메시지 전달 메서드의 종류

 메시지 메서드

Runnable 메서드 

기능 

sendMessage() 

post() 

큐의 마지막에 메시지를 추가한다 

sendMessageAtFrontQueue() 

postAtFrontOfQueue() 

큐의 맨앞에 메시지를 추가하여 우선적으로 처리하도록 한다. 

sendMessageAtTime()

postAtTime()

예상 실행 시간을 넣어 메시지를 추가한다. 

sendMessageDelayed() 

postDelayed() 

특정시간만큼 지연한 다음에 메시지 큐에 추가한다. 


- public final boolean post(Runnable r)

: 메시지 큐에 Runnable 객체 r를 추가한다. Runnable r은 안드로이드에 의하여 스레드로 만들어 작동한다. 메시지큐에 성공적으로 추가되면 true, 실패하면 fasle가 반환한다.


- public final boolean sendMessage(Message msg)

: 메시지 큐에 메시지를 추가한다. 메시지는 핸들러의 handleMessage(Message msg)에 의하여 작업하게 된다. 메시지 큐에 성공적으로 추가되면 true, 실패하면 false가 반환된다.


package com.example.progressbar_handler;


import android.app.Activity;

import android.app.Dialog;

import android.app.ProgressDialog;

import android.content.DialogInterface;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.os.SystemClock;

import android.view.Menu;

import android.view.View;

import android.widget.Button;


public class ProgressBarHandler extends Activity {

private static final int DIALOG_HANDLER = 3;

private static final int MAX_PROGRESS = 100;

private ProgressDialog HProgressDialog;

private int mProgress;

private Handler mProgressHandler;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button UiHandlerButton = (Button)findViewById(R.id.UiHandler);

UiHandlerButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View arg0) {

// TODO Auto-generated method stub

showDialog(DIALOG_HANDLER);

new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

HProgressDialog.setProgress(0);

for (mProgress = 0; mProgress <= MAX_PROGRESS; mProgress+=1) {

mProgressHandler.sendEmptyMessage(0);

SystemClock.sleep(100);

}

HProgressDialog.dismiss();

}

}).start();

}

});

mProgressHandler = new Handler() {


@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

super.handleMessage(msg);

HProgressDialog.incrementProgressBy(1);

}

};

}

// onCrateDialog() 메서드를 사용하여 Dialog 객체를 생성.

@Override

protected Dialog onCreateDialog(int id) {

// TODO Auto-generated method stub

// return super.onCreateDialog(id);

switch(id) {

case DIALOG_HANDLER:

HProgressDialog = new ProgressDialog(this);

HProgressDialog.setIcon(android.R.drawable.ic_dialog_alert);

HProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

HProgressDialog.setMax(MAX_PROGRESS);

HProgressDialog.setButton(getText(R.string.alert_dialog_hide), new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

}

});

HProgressDialog.setButton2(getText(R.string.alert_dialog_cancel), new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

}

});

HProgressDialog.setTitle("Handler 방법");

return HProgressDialog;

default:

return null;

}

}

}








반응형

관련글 더보기

댓글 영역