주기적작업
경우에 따라 앱에서 특정 작업을 주기적으로 실행해야 할 수 있다.
예를 들어 주기적으로 데이터를 백업하거나 최신 컨텐츠를 앱에 다운로드 하거나 로그를 서버에 업로드해야 할 수 있다.
이 때 주기적으로 실행되는 WorkManager를 만들 수 있다.
class WorkManager1(context : Context, workerParameters: WorkerParameters) : Worker(context, workerParameters){
override fun doWork(): Result {
Log.d("WorkManager1", "doWork")
val format = SimpleDateFormat("hh:mm:ss")
val currentTime = format.format(Date())
Log.d("WorkManager1",currentTime )
return Result.success()
}
}
먼저 일정 시간마다 실행되는 것을 확인하기 위해 현재 시간 로그를 찍는 WorkManager를 만들었다.
val workManager = PeriodicWorkRequestBuilder<WorkManager1>(15, TimeUnit.MINUTES).build()
WorkManager.getInstance(this).enqueue(workManager)
이제 MainActivity에서 OneTime이 아니라 PeriodWorkRequest를 사용하여 언제마다 실행시킬지 정할 수 있다.
나는 15분마다라고 설정을 하였다. 그럼 1분 마다도 실행할 수 있는지 궁금하여 PeriodWorkRequest를 살펴보았더니
public final class PeriodicWorkRequest extends WorkRequest {
/**
* The minimum interval duration for {@link PeriodicWorkRequest} (in milliseconds).
*/
@SuppressLint("MinMaxConstant")
public static final long MIN_PERIODIC_INTERVAL_MILLIS = 15 * 60 * 1000L; // 15 minutes.
최솟값이 15분이라고 나와있다. 따라서 1이라고 적어도 15분마다 최솟값인 15에따라 15분마다 실행되는 것을 주의해야한다!
정확히 15분 뒤에 실행되는 것을 확인할 수 있다.
고유작업
고유작업은 작업관리의 방식 중 하나인데, 예를 들어 24시간 마다 로그를 한 번만 로그를 업로드 하려고 시도할 때
예기치 못한 상황에 따라 여러 번 추가되는 상황이 발생하기도 한다.
따라서 이 때 고유작업을 사용하여 중복 예약 문제를 해결할 수 있다.
다음 예시를 살펴보자.
class TestWorkManager(context : Context, params: WorkerParameters) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
Log.d("TestWorkManager", "START")
for(i in 0..3){
Log.d("TestWorkManager", i.toString())
delay(1000)
}
Log.d("TestWorkManager", "END")
return Result.success()
}
}
CoroutineWorker를 사용하는 1초마다 1, 2, 3이 찍히는 WorkManager가 있다.
//기존에 했던 방식
val testWorkManager = OneTimeWorkRequestBuilder<TestWorkManager>().build()
WorkManager.getInstance(this).enqueue(testWorkManager)
버튼을 누를 때 마다 위의 코드처럼 기존에 했던 방식으로 workManager를 실행해보자.
이렇게 누를 때 마다 실행되어 위와 같은 현상이 발생하여 중복으로 작업이 진행되는 문제가 생긴다.
WorkManager.getInstance(this).enqueueUniqueWork("test", ExistingWorkPolicy.KEEP, testWorkManager)
우리는 enqueue가 아닌, UniqueWork가 붙은 enqueue를 사용하여 이 문제를 해결할 수 있다.
먼저 Keep은 다음과 같다.
아무리 버튼을 눌러도 중복으로 실행되지 않고 먼저 눌렀던 작업이 끝나야 다음 작업을 실행할 수 있다.
WorkManager.getInstance(this).enqueueUniqueWork("test", ExistingWorkPolicy.REPLACE, testWorkManager)
또한, Replace도 있다. 다음 결과를 살펴보자.
이는 keep과 다르게 실행은 시킬 수 있지만, 먼저 실행했던 작업을 도중에 멈추고 새로운 작업을 실행한다.
이렇게 UniqueWork를 사용하면 중복작업의 문제를 해결할 수 있다!!
주기적작업
고유작업
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] DataStore (0) | 2022.09.25 |
---|---|
[JETPACK개론] Navigation (0) | 2022.09.18 |
[JETPACK개론] WorkManager(4) + 작업진행률 관찰 (0) | 2022.09.14 |
[JETPACK개론] WorkManager(3) + Chaining, Coroutine (0) | 2022.09.09 |
[JETPACK개론] WorkManager(2) + Sending, Receiver Data (0) | 2022.09.08 |