Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Android에서 Handler(핸들러) 사용하는 방법 – 단계별 예제 가이드

Android에서 Handler(핸들러)란 무엇인가?

Handler는 Android에서 백그라운드 스레드와 UI 스레드 사이의 통신을 담당하는 핵심 클래스입니다. Android에서는 UI(View) 관련 작업을 반드시 메인(UI) 스레드에서 처리해야 하기 때문에, Timer나 Thread 같은 백그라운드 작업 결과를 화면에 반영하려면 Handler가 필수적입니다.

이번 글에서는 Handler를 활용하여 버튼이 1초마다 화면의 임의 위치로 이동하는 예제를 단계별로 살펴보겠습니다.


1단계 – 새 프로젝트 생성하기

Android Studio를 실행한 뒤, 상단 메뉴에서 File ⇒ New Project를 선택하고 새 프로젝트 생성에 필요한 모든 정보를 입력합니다.

2단계 – 레이아웃 파일(activity_main.xml) 작성하기

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android"
    android:orientation = "vertical"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent">
    <Button
        android:id = "@+id/my_button"
        android:layout_width = "100dp"
        android:layout_height = "wrap_content"
        android:layout_x = "0dp"
        android:layout_y = "0dp"
        android:text = "Yes" />
</LinearLayout>

위 코드에서는 화면에 하나의 버튼(Button)을 배치했습니다. 이 버튼이 곧 Handler에 의해 움직이게 될 대상입니다.

3단계 – MainActivity.java 코드 작성하기

src/MainActivity.java 파일에 아래 코드를 추가합니다.

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentActivity;
import android.util.DisplayMetrics;
import android.widget.Button;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends FragmentActivity {
    Handler handler;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        handler = new Handler();
        final Button button = (Button) findViewById(R.id.my_button);
        final DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Random R = new Random();
                        final float dx = R.nextFloat() * displaymetrics.widthPixels;
                        final float dy = R.nextFloat() * displaymetrics.heightPixels;
                        button.animate()
                            .x(dx)
                            .y(dy)
                            .setDuration(0)
                            .start();
                    }
                });
            }
        }, 0, 1000);
    }
}

코드 동작 원리 살펴보기

  • Handler 객체 생성: 메인 스레드에서 Handler를 생성하면 해당 스레드의 Looper(MessageQueue)에 연결됩니다.
  • Timer + TimerTask: 0ms 후 시작하여 1000ms(1초) 간격으로 백그라운드 스레드에서 작업을 반복 실행합니다.
  • handler.post(): 백그라운드 스레드에서 실행 중인 Runnable을 메인(UI) 스레드로 전달하여 UI 변경 작업을 안전하게 수행합니다.
  • Random 좌표 계산: DisplayMetrics로 얻은 화면 크기 내에서 임의의 x, y 좌표를 생성합니다.
  • button.animate(): View 애니메이션 API를 사용해 버튼을 해당 좌표로 즉시(setDuration(0)) 이동시킵니다.

결과적으로 앱을 실행하면 "Yes" 버튼이 1초마다 화면의 랜덤한 위치로 점프하는 것을 확인할 수 있습니다.

4단계 – 애플리케이션 실행하기

실제 Android 기기를 컴퓨터에 연결했다고 가정하고 진행합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run(실행) 아이콘을 클릭하세요. 옵션 목록에서 자신의 모바일 기기를 선택하면, 기본 화면과 함께 앱이 실행되고 버튼이 주기적으로 이동하는 모습을 볼 수 있습니다.

Android에서 Handler(핸들러) 사용하는 방법 – 단계별 예제 가이드


마무리 정리

Handler는 단순히 지연 실행뿐 아니라 백그라운드 스레드의 결과를 안전하게 UI에 반영할 때 가장 널리 쓰이는 도구입니다. 참고로 최신 Android 개발에서는 Kotlin Coroutines, postDelayed(), ViewModel 등 더 현대적인 대안도 많이 사용되지만, Handler의 동작 원리를 이해해 두면 Android의 스레딩 구조를 파악하는 데 큰 도움이 됩니다.