쏭식
Ssongcode;
쏭식
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • JAVA (21)
      • Basic (21)
    • Kotlin (14)
      • Basic (14)
    • Android (64)
      • Basic (24)
      • JETPACK (30)
      • Compose (8)
      • 파고들기 (2)
    • Project (4)
    • etc (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 컴포즈
  • 리사이클러뷰
  • 코드업100제
  • Jetpack
  • Room
  • DataBinding
  • compose
  • 기초100제
  • 코테
  • livedata
  • 프로젝트회고
  • 객체지향
  • workmanager
  • AAC
  • 상속
  • Kotlin
  • 코틀린코테
  • mvvm
  • Android
  • 알고리즘
  • 변수
  • 코틀린
  • 자바
  • ViewModel
  • 메소드
  • 배열
  • 자료구조
  • 백준
  • 코딩테스트
  • Adapter

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쏭식

Ssongcode;

[JETPACK개론] WorkManager(5) + 주기적작업, 고유작업
Android/JETPACK

[JETPACK개론] WorkManager(5) + 주기적작업, 고유작업

2022. 9. 17. 23:59

주기적작업

경우에 따라 앱에서 특정 작업을 주기적으로 실행해야 할 수 있다.

예를 들어 주기적으로 데이터를 백업하거나 최신 컨텐츠를 앱에 다운로드 하거나 로그를 서버에 업로드해야 할 수 있다.

이 때 주기적으로 실행되는 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를 실행해보자.

결과화면1
결과화면2

이렇게 누를 때 마다 실행되어 위와 같은 현상이 발생하여 중복으로 작업이 진행되는 문제가 생긴다.

WorkManager.getInstance(this).enqueueUniqueWork("test", ExistingWorkPolicy.KEEP, testWorkManager)

우리는 enqueue가 아닌, UniqueWork가 붙은 enqueue를 사용하여 이 문제를 해결할 수 있다.

먼저 Keep은 다음과 같다.

결과화면

아무리 버튼을 눌러도 중복으로 실행되지 않고 먼저 눌렀던 작업이 끝나야 다음 작업을 실행할 수 있다.

WorkManager.getInstance(this).enqueueUniqueWork("test", ExistingWorkPolicy.REPLACE, testWorkManager)

또한, Replace도 있다. 다음 결과를 살펴보자.

결과화면

이는 keep과 다르게 실행은 시킬 수 있지만, 먼저 실행했던 작업을 도중에 멈추고 새로운 작업을 실행한다.

이렇게 UniqueWork를 사용하면 중복작업의 문제를 해결할 수 있다!!

 

주기적작업

 

GitHub - SsongSik/JetPack_Android_Practice: Android practice using the Jetpack library

Android practice using the Jetpack library. Contribute to SsongSik/JetPack_Android_Practice development by creating an account on GitHub.

github.com

 

고유작업

 

GitHub - SsongSik/JetPack_Android_Practice: Android practice using the Jetpack library

Android practice using the Jetpack library. Contribute to SsongSik/JetPack_Android_Practice development by creating an account on GitHub.

github.com

 

저작자표시 (새창열림)

'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
    'Android/JETPACK' 카테고리의 다른 글
    • [JETPACK개론] DataStore
    • [JETPACK개론] Navigation
    • [JETPACK개론] WorkManager(4) + 작업진행률 관찰
    • [JETPACK개론] WorkManager(3) + Chaining, Coroutine
    쏭식
    쏭식

    티스토리툴바