WorkManager와 worker에 대해 공부를 하다가 이상한 점을 발견하였다.
위와 같이 doWork의 Thread와 onStopped의 Thread가 다르다는 것 이였다.
왜 두 개의 Thread가 다른지 이해가 되지않아 WorkManager와 Worker의 동작 원리 및 내부 소스에 대해 분석해보았다.
- WorkManager
1. WorkManager 초기화
기본적으로 WorkManager는 자동으로 초기화된다.
기본적으로 WorkManager는 내장 ContentProvider를 사용하여 자동으로 초기화를 한다는 내용이다.
아래는 자동으로 초기화 하는 과정이다.
위와 같이 Application 보다 먼저 ContentProvider를 사용하여 WorkManager를 초기화하는 작업을 진행한다.
하지만 WorkManager의 작업을 직접 관리하거나 예약하는 방법을 더 제어해야하는 경우 직접 초기화 할 수 있다.
ContentProvider는 Application 객체보다 먼저 생성되고 실행되므로 대부분의 경우 코드가 실행되기 전에 WorkManager 싱글톤을 설정할 수 있도록 한다.
주문형 초기화(on-demand initialization)
Application 클래스에서 Configuration.Provider 인터페이스를 구현하고Configuration.Provider.getWorkManagerConfiguration()을 자체적으로 구현할 수 있다.
2. WorkManager 동작
위와 같이 constraints와 newsWorkRequest를 설정해주고 workerManager.enqueue를 호출하면 workManager는 설정한 내용으로 스케줄을 생성한다.
WorkManager의 enqueque 메서드를 봐보자.
결국 Shedulers.java에 WorkManager의 작업을 스케줄링하는 과정이다.
여기서는 두 가지 유형의 작업을 스케줄링하고 있다.
제한된 슬롯을 가진 스케줄러에 대한 작업(eligibleWorkSpecsForLimitedSlots)
그리고
제한된 슬롯이 없는 스케줄러에 대한 작업(allEligibleWorkSpecs)
1. 제한된 슬롯을 가진 스케줄러에 대한 작업 스케줄링:
eligibleWorkSpecsForLimitedSlots 리스트가 비어 있지 않다면, 이 리스트의 작업들을 배열로 변환하고,
각 Scheduler에 대해 hasLimitedSchedulingSlots() 메소드를 호출하여 제한된 슬롯을 가진 스케줄러인지 확인한다.
제한된 슬롯을 가진 스케줄러라면, schedule() 메소드를 호출하여 작업을 스케줄링을 하는 작업이다.
2. 제한된 슬롯이 없는 스케줄러에 대한 작업 스케줄링:
allEligibleWorkSpecs 리스트가 비어 있지 않다면, 이 리스트의 작업들을 배열로 변환하고,
각 Scheduler에 대해 hasLimitedSchedulingSlots() 메소드를 호출하여 제한된 슬롯이 없는 스케줄러인지 확인한다.
제한된 슬롯이 없는 스케줄러라면, schedule() 메소드를 호출하여 작업을 스케줄링을 하는 작업이다.
Schedulers에는 systemJobScheduler와 GreedyScheduler가 존재하는데,
GreedyScheduler를 보자
Schedulers에서 GreedyScheduler Scheduler()를 호출하고, GreedyScheduler의 Scheduler는 여러 작업을 하고
WorkLauncher의 startWork를 호출하고 있다.
즉, WorkeManager.enqueue를 호출하면 스케줄을 등록하고, 위와 같은 소스 흐름으로 doWork()를 동작 시키게 되는 것 이다.
Worker.java 소스를 보면 startWork() 메소드 내에서 백그라운드 스레드를 생성하고, 그 스레드에서 doWork() 메소드를 실행한다.
결국 내부적으로 스레드 풀을 관리하여 작업을 스케줄링하고, 작업을 백그라운드 스레드에서 실행하여,
doWork()의 스레드 로그가 work로 보였던 것 이다.
Worker의 onStopperd()를 호출했을 때 알아보자
위와 같이 doWork()에서 생성한 백그라운드 스레드를 interrupt하여 스레드를 중단한다.
Background Task Inspector를 이용하여 내가 동작시키고 있는 worker을 확인할 수 있다.
https://developer.android.com/reference/androidx/work/package-summary
'안드로이드' 카테고리의 다른 글
안드로이드 JVM과 ART, DVM의 차이 (0) | 2023.10.17 |
---|---|
안드로이드 Context (0) | 2023.10.17 |
안드로이드 Serializable와 Parcelable (0) | 2023.10.17 |
안드로이드 Room (0) | 2023.10.09 |
안드로이드 Hilt (0) | 2023.10.09 |