반응형
우선 WorkManager에 대해 알아보기 전에 Android의 백그라운드 처리에 대해 알아볼 것이다.
그리고 Jetpack의 WorkManager를 시작으로 다양한 백그라운드 작업 유형을 실습해보려고 한다.
Android 백그라운드 처리
일반적으로 장기 실행 작업은 백그라운드 처리를 기본 원칙으로 한다.
(ex. 비트맵 디코딩, 저장소 액세스, 머신러닝 모델 작업, 네트워크 요청)
백그라운드 작업은
- Immediate (즉시) : 사용자가 App과 상호작용하는 동안 작업을 완료해야 하는 경우
- Deferrable (정시) : 바로 처리할 필요가 없거나, 특정 작업을 정확한 시간에 실행해야 하는 경우
- Long Running (지연) : 작업을 끝내는데 시간이 좀 걸리거나, 정확한 시간에 실행할 필요가 없는 경우
카테고리 중 하나에 속한다.
또한 이 3가지 카테고리에서도 백그라운드 작업은
- persistent (지속적) : 앱 재시작/디바이스 재부팅 후에도 예약(scheduled)된 상태로 유지됨
- impersistent (비지속적) : 프로세스가 종료된 후에는 더 이상 예약되지 않음
으로 나뉘어 처리할 수 있다.
공식문서에서 추천하는 해결 방법
카테고리 | Persistent | Impersistent |
Immediate (즉시) | WorkManager | Coroutines |
Long Running (지연) | WorkManager | Not recommended |
Deferrable (정시) | WorkManager | Not recommended |
- 모든 Persistent 작업은 WorkManager를 통해서 실행되어야 한다.
- Immediate Impersistent 작업은 Kotlin Coroutines를 통해서 처리하는 것을 권장한다.
- Long Running Impersistent/Defferable Impersistent 작업은 하지 않아야 하고, 대신 WorkManager를 사용하여 persistent 작업을 통해 Impersistent 작업을 완료하는 것을 권장한다.
👀 Immediate (즉시)
: 즉시 실행되어야 하는 작업
ex. 데이터 소스에서 데이터를 로드할 때, 채팅으로 메세지를 보낼 때
- Persistent 작업 : 앱을 백그라운드로 전환하거나 디바이스를 재부팅하더라도 즉시 실행해야 하는 작업
- WorkManager를 OneTimeWorkRequest와 함께 사용해야 함
- setExpedated()를 사용하여 WorkManager를 신속하게 처리함
- Impersistent 작업 : 사용자에게 중요하거나 나중에 실행이 지연되도록 예약할 수 없는 작업
- Kotlin Coroutine / Threading(자바) 권장
〰️ Long Running (지연)
: 완료하는 데에 10분 이상 걸리는 작업
ex. 앱이 큰 파일을 다운로드할 때
- Persistent 작업 : WorkManager를 사용하여 Long Running Worker를 사용하여 처리
- 사용자에게 작업 처리 진행과정을 보여주어야 하는 경우, Worker의 setForground()를 호출할 수 있음
➿ Deferrable (정시)
: 당장 처리하지 않아도 되는 작업
ex. 백엔드와 정기적으로 데이터를 동기화하려고 할 때 (사용자가 동기화 트리거X, 디바이스가 idle일 때도O)
- Persistent 작업 : WorkManager를 통해 앱이 백그라운드로 전환되거나 디바이스를 재부팅할 때 즉시 실행할 필요는 없지만 예약 상태를 유지해야 하는 작업을 처리
- 정확한 시점에 실행해야 하는 작업에는 AlarmManager를 사용할 수 있음
- 알람시계/캘린더 이벤트와 같은 정확한 알람을 예약할 때만 사용
- 백그라운드 작업을 예약할 때 디바이스를 Doze 모드(절전모드)에서 깨우므로 장치의 배터리 수명/전체 시스템 상태에 부정적인 영향을 미칠 수 있음
reference >
한국어 공식문서보다 원문이 더 친절한 느낌이었다...
반응형
'ANDROID > Android 앱 프로그래밍' 카테고리의 다른 글
[Android] 위젯 속성 지정하는 헷갈리는 코드 (feat. Kotlin) (0) | 2022.03.04 |
---|---|
[Android] FCM 푸시 알림(Notification) (0) | 2022.02.07 |
[Android] Context란? (0) | 2022.01.11 |
[Android] Application 클래스 (0) | 2022.01.10 |
[Android] 뷰 바인딩(View Binding) in Activity, Fragment, RecyclerView (0) | 2021.08.10 |
[Android] 데이터베이스(Database)와 내용 제공자(Content Provider) (0) | 2021.07.06 |
[Android] 모바일 데이터베이스(Database)와 테이블(Table) 생성 (3) | 2021.07.04 |
[Android] Retrofit2를 사용한 API 통신 (0) | 2021.07.04 |
댓글