본문 바로가기
Android/Features

[Android] 스레드(Thread)와 핸들러(Handler)

by startSW 2023. 11. 22.

스레드(Thread)

안드로이드에서 스레드(Thread)는 동시에 여러 작업을 수행하기 위해 사용되는 기본적인 프로그래밍 개념 중 하나입니다. 안드로이드 애플리케이션은 기본적으로 메인 스레드에서 실행되지만, 메인 스레드에서 오랜 시간 동안 작업을 수행하면 UI가 응답하지 않는 등의 문제가 발생할 수 있습니다. 따라서 안드로이드에서는 백그라운드 스레드를 사용하여 메인 스레드에서 실행되는 작업을 분리하고 병렬적으로 실행할 수 있습니다.

  • 메인 스레드:
    • 안드로이드 애플리케이션의 모든 UI 조작은 메인 스레드에서 이루어집니다.
    • 사용자와의 상호작용 및 화면 갱신은 메인 스레드에서 처리되어야 합니다.
  • 백그라운드 스레드:
    • 네트워크 작업, 파일 다운로드, 데이터베이스 액세스 등과 같이 시간이 오래 걸리는 작업은 메인 스레드에서 수행하지 않아야 합니다. 이를 위해 백그라운드 스레드를 사용합니다.
  • Thread 클래스:
    • 안드로이드에서 스레드는 Java의 기본 Thread 클래스를 확장하여 구현됩니다.
    • Thread 클래스를 상속받아 새로운 스레드를 만들고, run 메서드를 오버라이드하여 스레드가 수행할 작업을 정의합니다.
    public class MyThread extends Thread {
        @Override
        public void run() {
            // 백그라운드에서 수행할 작업
        }
    }
    
    

 

핸들러(Handler)

  • 메인 스레드와 백그라운드 스레드 사이의 통신을 관리하는 데 사용됩니다.
  • 핸들러는 메시지 및 러너(Runnable) 객체를 사용하여 다른 스레드에서 메인 스레드로 작업을 보낼 수 있습니다.
  • 일반적으로 핸들러는 백그라운드 스레드에서 작업을 수행하고, 그 결과를 메시지로 메인 스레드에 보내거나 UI 업데이트를 예약합니다.
  • 작업 스케줄링(Task Scheduling)을 수행합니다.
    • 핸들러를 사용하면 특정 작업을 지연하거나 주기적으로 실행할 수 있습니다. 예를 들어, postDelayed 메서드를 사용하여 일정 시간이 지난 후에 작업을 실행하거나, postDelayedpostDelayed를 결합하여 주기적인 작업을 실행할 수 있습니다.
  • 메시지 큐와 루퍼로 구성되어 있습니다.
    • 핸들러는 내부적으로 메시지 큐(Message Queue)와 루퍼(Looper)를 사용합니다. 메시지 큐는 스레드 간 메시지를 보관하고 처리하며, 루퍼는 메시지 큐를 순환하면서 메시지를 처리합니다. 이를 통해 비동기 작업을 처리하고 메인 스레드와 백그라운드 스레드 간 통신이 가능해집니다.
    • 핸들러의 루퍼는 주로 메인(UI) 스레드에서 실행됩니다. 안드로이드에서 각 스레드에는 루퍼(Looper)가 연결되어 있으며, 메인 스레드에는 디폴트로 루퍼가 포함되어 있습니다.
    • 핸들러를 사용할 때, 메인(UI) 스레드에서 핸들러를 생성하면 해당 핸들러는 자동으로 메인 스레드의 루퍼를 사용하게 됩니다. 이것은 핸들러에 작업을 보낼 때 해당 작업이 메인 스레드에서 실행됨을 의미합니다.
    • 예를 들어, 다음 코드에서 핸들러를 메인(UI) 스레드에서 생성하고 사용하면 해당 핸들러는 메인 스레드의 루퍼와 연결되어 있습니다
Handler handler = new Handler();

handler.post(new Runnable() {
    @Override
    public void run() {
        // 이 부분의 코드는 메인(UI) 스레드에서 실행됩니다.
        // UI 업데이트 등을 수행할 수 있습니다.
    }
});

 

  • Runnable 인터페이스를 이용합니다.
    • 핸들러는 android.os.Handler 클래스를 사용하여 생성하고, Runnable 인터페이스를 구현한 작업을 실행합니다. post, postDelayedsendMessage 메서드를 사용하여 Runnable 객체를 큐에 추가하고 실행합니다.
javaCopy code
// 핸들러 생성 (메인 스레드에서 생성해야 함)
Handler handler = new Handler();

// 백그라운드 스레드에서 메인 스레드로 작업 전달
handler.post(new Runnable() {
    @Override
    public void run() {
        // 메인 스레드에서 실행할 작업
        textView.setText("Hello from Handler!");
    }
});

// 일정 시간 후에 작업 실행
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // 메인 스레드에서 실행할 작업
        // ...
    }
}, 1000); // 1초 후에 실행