< 개발 환경 > < 프로젝트 적용 > |
안드로이드/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); } }
파일첨부 :
스크린샷 :
'Android > Thread' 카테고리의 다른 글
안드로이드/Android 간단한 Handler 사용법 ~! (1) | 2013.02.20 |
---|---|
안드로이드/Android AsyncTask 사용법 (4) | 2012.07.25 |
안드로이드/Android Handler 와 Timer(TimerTask) 를 활용한 Intro 화면 구성 (11) | 2012.03.20 |
안드로이드/Android Thread 사용하기~! (4) | 2012.01.30 |
안드로이드/Android Android에서 Thread(쓰레드) 란 무엇 인가? (5) | 2011.10.25 |