Service와 Thread의 차이 및 사용 시점
1. Service
- 정의: 안드로이드에서 백그라운드 작업을 수행하는 컴포넌트.
- 특징:
- 애플리케이션이 종료되더라도 백그라운드에서 실행될 수 있음.
- 기본적으로 메인 스레드(UI 스레드)에서 실행됨.
- 별도의 스레드를 생성하지 않음 → 따라서 무거운 작업(네트워크 요청, 파일 처리 등)을 수행하면 ANR (Application Not Responding) 오류 발생 가능.
- startService() → 독립 실행 (종료 필요)
- bindService() → 다른 컴포넌트와 바인딩하여 실행 (사용 중이면 유지됨)
- 언제 사용하나?
- 사용자가 직접 조작하지 않아도 실행되어야 하는 작업.
- 예시:
- 음악 재생 서비스
- 백그라운드에서 데이터 동기화
- GPS 기반 위치 서비스
2. Thread
- 정의: 프로세스 내에서 실행되는 독립적인 작업 단위.
- 특징:
- 별도의 메인 스레드(UI 스레드)와는 독립적으로 실행됨.
- 여러 개 생성 가능하여 다중 작업 병렬 실행 가능.
- UI 업데이트는 불가능 (UI 변경이 필요하면 Handler, runOnUiThread(), LiveData 등을 사용해야 함).
- 언제 사용하나?
- CPU를 많이 사용하는 작업을 처리할 때.
- 예시:
- 네트워크 요청 (API 호출)
- 데이터베이스 작업
- 이미지 로딩 및 처리
Service vs Thread 요약 비교
실행 환경 | 메인 스레드에서 실행 | 별도의 백그라운드에서 실행 |
멀티태스킹 | 메인 스레드 점유 | 멀티태스킹 가능 |
실행 지속성 | 앱 종료 후에도 지속 가능 | 앱 종료 시 종료됨 |
UI 접근 | 가능하지만 무거운 작업 시 ANR 발생 가능 | 직접 접근 불가능 (Handler 필요) |
주요 목적 | 장기간 실행되는 작업 | 짧고 집약적인 작업 |
언제 Service + Thread를 함께 사용할까?
- 서비스 내에서 별도 스레드를 생성하여 백그라운드 작업을 수행하는 경우
- 기본적으로 Service는 메인 스레드에서 실행되므로 네트워크 요청, 데이터베이스 쿼리 등 긴 작업이 필요할 경우 새로운 Thread를 생성하여 실행해야 한다.
- 안드로이드에서는 IntentService(현재는 WorkManager가 권장됨)를 사용하여 자동으로 백그라운드 작업을 처리할 수도 있음.
예제 코드
1. 잘못된 서비스 사용 (ANR 발생 가능)
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 메인 스레드에서 실행되므로 ANR 발생 가능
for (int i = 0; i < 1000000; i++) {
Log.d("MyService", "Heavy task running: " + i);
}
return START_STICKY;
}
}
✅ 해결 방법: 새로운 스레드 생성
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(() -> {
for (int i = 0; i < 1000000; i++) {
Log.d("MyService", "Heavy task running: " + i);
}
}).start();
return START_STICKY;
}
}
결론
- 단순한 병렬 작업은 Thread 사용.
- 백그라운드에서 장기간 실행되는 작업은 Service 사용.
- Service 내에서 무거운 작업을 할 경우, 반드시 별도 Thread를 생성하여 실행해야 함.
'잡동사니 > 에러&팁' 카테고리의 다른 글
SW 개발 순서 (0) | 2025.04.08 |
---|---|
[STM32CubeProgrammer 렉] 해결법 (0) | 2025.04.04 |
[터미널 프로그램] TeraTerm, Putty에서 깨진 문자 (0) | 2025.03.28 |
[작업 스케쥴러] 윈도우 시작 시, 특정 폴더 자동으로 열기 (0) | 2025.03.26 |