본문 바로가기
안드로이드(자바)

[안드로이드스튜디오Java] Thread와 Handler

by 하_영 2023. 11. 23.

안드로이드스튜디오에서 쓰레드를 잘 다루면 앱의 성능을 향상시키고 사용자 경험을 개선시킬 수 있다. 

 

Thread와 Handler를 제대로 사용하기위해선 자바와 안드로이드의 작동원리를 이해해야한다.

 

자바 프로그램은 main메서드에서 시작하며 이 main메서드가 실행되는것은 하나의 쓰레드에서 진행된다. 그리고 이것을 메인 (UI) 쓰레드라고 부른다.

 

메인(UI)쓰레드

  • 안드로이드 앱에서는 메인(UI) 쓰레드가 앱의 사용자 인터페이스를 관리한다.
  • 메인(UI) 쓰레드에서는 UI 업데이트와 사용자 입력에 관련된 작업을 수행한다.

백그라운드 쓰레드

  • 복잡한 계산이나 네트워크 요청과 같은 무거운 작업은 메인(UI) 쓰레드에서 수행하지 않고 별도의 백그라운드 쓰레드에서 처리한다. 백그라운드에서 실행하지 않으면 UI가 반응하지 않게 될 수 있다.

핸들러(Handler)와 메시지큐(MessageQueue)

  • 안드로이드에서는 메인(UI) 쓰레드 외의 다른 쓰레드에서 UI를 업데이트하려면 핸들러와 메시지 큐를 사용한다.
  • 핸들러는 메시지 큐와 연결되어 다른 쓰레드에서 메시지를 보내고 받을 수 있게 한다.
  • Looper는 메시지 큐를 처리하는 역할을 합니다. 메시지 큐에 메시지가 있으면 Looper가 이를 꺼내서 해당 메시지의 run 메서드를 실행한다.

 

쓰레드(Thread)란?

쓰레드는 동시에 여러 작업을 수행할 수 있도록 하는 프로그래밍 구조

일반적으로 백그라운드에서 실행되는 작업이나 UI업데이트와같은 비동기 작업에 사용된다.

 

쓰레드를 사용하는 방법 

 

1. Thread 클래스 사용

public class MyThread extends Thread {
    @Override
    public void run() {
        // 쓰레드에서 수행할 작업
    }
}

// Thread 클래스 사용
MyThread myThread = new MyThread();
myThread.start(); // 쓰레드 실행

 

Thread 클래스는 자바에서 제공하는 쓰레드를 직접적으로 상속받아서 구현한다. run메서드를 오버라이드하여 쓰레드에서수행할 작업을 정의한다. 

이이후에 해당 클래스의 인스턴스를 생성하고 start메서드를 호출하여 쓰레드를 실행시킨다.

 

 

2. Runnable인터페이스 사용

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 쓰레드에서 수행할 작업
    }
}

//Runnable 인터페이스 사용
Thread myThread = new Thread(new MyRunnable());
myThread.start(); // 쓰레드 실행

 

Runnable을 구현한 클래스에서 run메서드를 정의하고 이 클래스의 인스턴스를 생성한 후, 이를 Thread 클래스의 생성자에게 전달하여 쓰레드를 생성하고 실행한다. 

자바는 단일상속만 허용하기때문에 일반적으로 Runnable인터페이스가 더 선호된다. 

 

*주의사항*

안드로이드 앱에서는 메인 쓰레드 외에는 직접 업데이트를 할 수 없다. 따라서 백그라운드에서 수행되는 쓰레드에서 UI를 업데이트해야하는 경우에는 핸들러(Handler)를 사용해야한다. 

 

 

 

핸들러(Handler)란?

핸들러는 쓰레드간의 통신을하고 비동기적인 작업을 수행하기 위해 사용된다. 

주로 UI업데이트, 다른 쓰레드간 통신, 지연된 작업과 주기적인 작업에 사용된다.

 

핸들러 사용법

//Handler 객체 생성
Handler handler = new Handler();

//Runnable을 핸들러에게 전달(메인 쓰레드로 보내기)
handler.post(new Runnable() {
    @Override
    public void run() {
        // 메인(UI) 쓰레드에서 실행할 작업 구현
    }
});

//원하는 타이밍에 실행시키기
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // 일정 시간 후에 실행할 작업 구현
    }
}, 1000); // 1초 후에 실행

//메시지 보내기
Message message = handler.obtainMessage();
// 메시지에 데이터 설정
handler.sendMessage(message);

//루프*
Looper.prepare(); // Looper 생성
Handler handler = new Handler(); // 핸들러 생성
Looper.loop(); // 루프 시작

 

요약하자면, 

안드로이드에선 메인쓰레드와 백그라운드 쓰레드간에 통신을 하기 위해 핸들러와 메시지큐를 사용한다.

핸들러는 루프를 통해 메시지큐에 메시지를 보내고 받아서 다른 쓰레드에서 UI업데이트 및 특정 작업을 실행하게한다. 

 

주로 네트워크, 데이터베이스, 파일다운로드, 프로토콜 통신 등이 비동기적으로 작동함으로 이와같은 코드를 작동시킬땐 Thread에 대한 이해가 필요하다.