스레드(Thread)
안드로이드에서 스레드(Thread)는 동시에 여러 작업을 수행하기 위해 사용되는 기본적인 프로그래밍 개념 중 하나입니다. 안드로이드 애플리케이션은 기본적으로 메인 스레드에서 실행되지만, 메인 스레드에서 오랜 시간 동안 작업을 수행하면 UI가 응답하지 않는 등의 문제가 발생할 수 있습니다. 따라서 안드로이드에서는 백그라운드 스레드를 사용하여 메인 스레드에서 실행되는 작업을 분리하고 병렬적으로 실행할 수 있습니다.
- 메인 스레드:
- 안드로이드 애플리케이션의 모든 UI 조작은 메인 스레드에서 이루어집니다.
- 사용자와의 상호작용 및 화면 갱신은 메인 스레드에서 처리되어야 합니다.
- 백그라운드 스레드:
- 네트워크 작업, 파일 다운로드, 데이터베이스 액세스 등과 같이 시간이 오래 걸리는 작업은 메인 스레드에서 수행하지 않아야 합니다. 이를 위해 백그라운드 스레드를 사용합니다.
- Thread 클래스:
- 안드로이드에서 스레드는 Java의 기본 Thread 클래스를 확장하여 구현됩니다.
- Thread 클래스를 상속받아 새로운 스레드를 만들고, run 메서드를 오버라이드하여 스레드가 수행할 작업을 정의합니다.
public class MyThread extends Thread { @Override public void run() { // 백그라운드에서 수행할 작업 } }
핸들러(Handler)
- 메인 스레드와 백그라운드 스레드 사이의 통신을 관리하는 데 사용됩니다.
- 핸들러는 메시지 및 러너(Runnable) 객체를 사용하여 다른 스레드에서 메인 스레드로 작업을 보낼 수 있습니다.
- 일반적으로 핸들러는 백그라운드 스레드에서 작업을 수행하고, 그 결과를 메시지로 메인 스레드에 보내거나 UI 업데이트를 예약합니다.
- 작업 스케줄링(Task Scheduling)을 수행합니다.
- 핸들러를 사용하면 특정 작업을 지연하거나 주기적으로 실행할 수 있습니다. 예를 들어, postDelayed 메서드를 사용하여 일정 시간이 지난 후에 작업을 실행하거나, postDelayed와 postDelayed를 결합하여 주기적인 작업을 실행할 수 있습니다.
- 메시지 큐와 루퍼로 구성되어 있습니다.
- 핸들러는 내부적으로 메시지 큐(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, postDelayed 및 sendMessage 메서드를 사용하여 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초 후에 실행
'Android > Features' 카테고리의 다른 글
[Android] BroadcastReceiver 사용하기 (0) | 2023.11.22 |
---|---|
[Android] 백그라운드 스레드에서 메인 스레드로 데이타 전달하는 방법 (0) | 2023.11.22 |
[Android] android java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 에러 원인 및 해결 방법 (0) | 2023.11.13 |
[Android] StartIntentSenderForResult 를 사용하여 외부 앱과 상호작용하기 (0) | 2023.10.14 |
[Android] registerForActivityResult (0) | 2023.10.14 |