본문 바로가기

Android/Handler.sendMessage()

Android Handler.sendMessage() example

안드로이드의 Handler 개념과 사용 예

안드로이드의 Handler는 개발자 정의 쓰레드와 UI 쓰레드를 연결해 주는 역할을 한다.

UI 쓰레드만이 안드로이드의 UI를 갱신할 수 있기 때문에 개발자 쓰레드에서 화면을 갱신할 필요가 있을 때는 UI 쓰레드와 연결을 담당하는 Handler클래스를 사용할 필요가 있다.

Handler클래스의 중요 메소드

Handler.sendMessage() --> 개발자 정의 쓰레드에서 호출하여 메시지 큐에 메시지를 저장한다.

Handler.handleMessage() --> UI 쓰레드에서 호출하여 큐에 저장된 메시지를 꺼낸다. 이 메소드는 UI쓰레드에서 호출하므로 그 안에서는 화면을 직접 갱신하는 내용을 작성할 수 있다.

위의 설명처럼 Handler클래스는 개발자 정의 쓰레드와 UI 쓰레드에서 호출될 수 있는 메소드를 가지고 있기 때문에 양자 사이의 연결을 위해 사용될 수 있는 것이다.

sendMessage(), handleMessage()를 사용하지 않고 Handler.post()를 이용하여 UI 쓰레드에게 실행할 코드를 전달하는 예제는 여기를 참조하세요

다음은 개발자 쓰레드에서 Handler를 경유하여 UI 쓰레드에게 화면을 갱신하도록 하는 예제이다.

res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TextView" /> </LinearLayout>


MainActivity.java

package com.example.androidapp; import android.app.Activity; import android.graphics.Point; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.MotionEvent; import android.widget.TextView; public class MainActivity extends Activity { TextView tv; int num; MyHandler handler; class MyHandler extends Handler {

/* UI Thread (Main Thread)에 의해 호출되는 메소드 */ public void handleMessage(android.os.Message msg) { tv.setText(tv.getText().toString()+(++num)); }; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.textView1); handler = new MyHandler();

/* 개발자 정의 쓰레드 */ new Thread() { public void run() { for(int i=0;i<10;i++) { Message msg = handler.obtainMessage();

/* 개발자 정의 쓰레드에서 호출되는 Handler 클래스의 메소드 */ handler.sendMessage(msg); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }; }.start(); } }