본문 바로가기

Android/Thread

안드로이드/Android Handler 사용 방법 ~!


 < 개발 환경 >  
   작성일 : 2013.01.27
   OS 설치 버전 : Windows7 32bit  
   SDK 설치 버전 : 안드로이드 SDK 4.2 (젤리빈) / API LEVEL : 17  
   ADT 설치 버전 : 21   
   Java 설치 버전 : JDK 1.6.0_20 / JRE6 
   이클립스 설치 버전 : Indigo
   테스트단말 : 삼성 갤럭시 S2 4.0.4 (아이스크램 샌드위치)   

 < 프로젝트 적용 > 
   Android Build Target / API LEVEL / Complie With : 17  
   minSdkVersion : 8 
   targetSdkVersion : 16  
   Java Compiler Level : 1.6  
   Text file encoding : UTF-8




안드로이드/Android Handler 사용 방법 ~!




안드로이드 프로젝트를 진행할 경우 스레드 작업을 많이 해주게 되는데요. 메인스레드의 UI 작업과 서브(작업)스레드의 백그라운드 작업을 나누어서 진행하게 됩니다.


안드로이드에서는 메인스레드와 서브스레드 간의 통신을 위해 Handler를 사용하게 되는데 Handler는 메시지큐를 사용한 메시지 전달 방법을 사용하게 됩니다. Handler에 Message가 들어오면 순서대로 쌓여서 FIFO(First in First Out) 형태로 메시지를 처리하게 됩니다. 가장 처음 들어온 Message를 우선 처리하게 됩니다.


Handler.sendEmptyMessage(int what)

Message what(ID) 를 사용할 경우 사용 하는 메서드 


Handler.sendMessage(Message msg)

Message what, arg1, obj 등 ID와 정보등을 같이 사용 하는 메서드


<Handler 구조>


사용예제


package arabiannight.tistory.com.handlerusing;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

	private static final int SEND_THREAD_INFOMATION = 0;
	private static final int SEND_THREAD_STOP_MESSAGE = 1;
	
	private SendMassgeHandler mMainHandler = null;
	private CountThread mCountThread = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		// 레이아웃 설정
		setLayout();
		
		// 메인 핸들러 생성
		mMainHandler = new SendMassgeHandler();
	
	}
	
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_thread_start:
			mCountThread = new CountThread();
			mCountThread.start();
			break;
			
		case R.id.btn_thread_stop_message:
			mMainHandler.sendEmptyMessage(SEND_THREAD_STOP_MESSAGE);
			break;

		default:
			break;
		}
	}
	
	// Handler 클래스
	class SendMassgeHandler extends Handler {
		
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			
			switch (msg.what) {
			case SEND_THREAD_INFOMATION:
				tv_Count.setText("현재시간 = " + msg.arg1 + "\n" + 
							"index = " + msg.arg2 + " 인 \n" + msg.obj);
				break;
				
			case SEND_THREAD_STOP_MESSAGE:
				mCountThread.stopThread();
				tv_Count.setText("Count Thread가 중지 되었습니다.");
				break;

			default:
				break;
			}
		}
		
	};
	
	// Thread 클래스
	class CountThread extends Thread implements Runnable {
		
		private boolean isPlay = false;
		
		public CountThread() {
			isPlay = true;
		}
		
		public void isThreadState(boolean isPlay) {
			this.isPlay = isPlay;
		}
		
		public void stopThread() {
			isPlay = !isPlay;
		}
		
		@Override
		public void run() {
			super.run();
			
			int i = 0;
			
			while (isPlay) {
				
				i++;
				
				// 메시지 얻어오기
				Message msg = mMainHandler.obtainMessage();
				
				// 메시지 ID 설정
				msg.what = SEND_THREAD_INFOMATION;
				
				// 메시지 정보 설정 (int 형식)
				msg.arg1 = Integer.valueOf(getNowDateTime()); 
				
				// 메시지 정보 설정2 (int 형식)
				msg.arg2 = i;
				
				// 메시지 정보 설정3 (Object 형식)
				String hi = new String("Count Thared 가 동작하고 있습니다.");
				msg.obj = hi;
				
				mMainHandler.sendMessage(msg);
				
				// 1초 딜레이
				try { Thread.sleep(1000); } 
				catch (InterruptedException e) { e.printStackTrace(); }
				
			}
			
		}
	}
	
	public String getNowDateTime() {
		Calendar calendar = Calendar.getInstance();
		Date date = calendar.getTime();
		return new SimpleDateFormat("HHmmss").format(date);
	}
	
	/**
	 * Layout
	 */
	private TextView tv_Count = null;
	
	public void setLayout() {
		tv_Count = (TextView) findViewById(R.id.tv_count);
	}

}




파일첨부 : 

TestHandlerUsing.zip



스크린샷 :