본문 바로가기
Android

Android WorkManager Example 안정적인 작업 처리하기

by kkong93 2023. 11. 8.
반응형

WorkManager는 백그라운드에서 실행해야 하는 지연 가능하고, 보장되어야 하는 작업을 위한 안드로이드 라이브러리입니다. 즉, 앱이 종료되거나 기기가 재부팅되더라도 실행되어야 하는 작업들을 관리하는 데 쓰이죠.

 

 

 

1. 유연성: 작업 실행에 대한 다양한 조건을 지정할 수 있습니다. 예를 들어, 네트워크가 연결되었을 때만 작업을 실행하거나, 기기가 충전 중일 때만 실행하는 것과 같은 조건들이죠.

 

2. 보장성: 작업이 예정대로 완료될 것임을 보장합니다. 예를 들어, 기기가 재시작되거나 앱이 종료되어도 작업이 계속됩니다.

 

3. 호환성: WorkManager는 API 레벨 14 (아이스크림 샌드위치) 이상에서 작동하며, 최신 안드로이드 버전의 기능을 이용할 수 있도록 최적화되어 있습니다.

 

4. 쉬운 통합: LiveData와 같은 다른 안드로이드 아키텍처 컴포넌트와 쉽게 결합할 수 있어, 작업의 상태를 UI에 반영하기 편리합니다.

 

 

 

WorkManager를 사용하는 기본적인 단계

 

1. WorkRequest 생성: 수행하고자 하는 작업을 정의합니다. 이것은 OneTimeWorkRequest(한 번만 실행) 또는 PeriodicWorkRequest(주기적 실행)가 될 수 있습니다.

 

2. 조건 설정: 작업이 실행될 조건을 설정합니다. 예를 들어, Wi-Fi에 연결되어 있어야 한다든지, 기기가 충전 중이어야 한다는 조건을 추가할 수 있습니다.

 

3. WorkManager에 작업 요청: 설정한 WorkRequest를 WorkManager에 전달합니다. 그러면 WorkManager가 알맞은 시간에 작업을 실행합니다.

 

4. 작업 상태 감시: WorkManager는 LiveData를 사용하여 작업의 상태를 알려주므로, 이를 통해 작업의 진행 상태나 결과를 UI에 반영할 수 있습니다.

 

이러한 기능을 통해 개발자는 백그라운드 작업을 더욱 쉽고 효율적으로 관리할 수 있습니다.

 

간단한 WorkManager 예시 : 네트워크 상태가 연결되었을 때 데이터를 백그라운드에서 동기화하는 간단한 예시 코드

 

dependencies {
    // WorkManager 라이브러리 추가
    implementation "androidx.work:work-runtime-ktx:2.7.1"
}

 

 

WorkManager에 의해 수행될 작업을 정의해야 합니다. 이를 위해 `Worker` 클래스를 상속받는 클래스를 만들어 `doWork()` 메서드를 오버라이드합니다.

 

import android.content.Context
import androidx.work.Worker
import androidx.work.WorkerParameters
import androidx.work.workDataOf

class DataSyncWorker(appContext: Context, workerParams: WorkerParameters)
    : Worker(appContext, workerParams) {

    override fun doWork(): Result {
        // 여기에서 데이터 동기화 로직을 수행합니다.
        // 예를 들어, 서버로부터 데이터를 받아와서 로컬 데이터베이스를 업데이트할 수 있습니다.
        
        // 데이터 동기화가 성공했다고 가정하고 성공 결과를 반환합니다.
        // 실패하거나 재시도가 필요한 경우 Result.retry()나 Result.failure()를 반환합니다.
        return Result.success(workDataOf("KEY_RESULT" to "Data synchronized successfully"))
    }
}

 

 

`WorkRequest`를 만들고 `WorkManager`에 작업을 등록합니다. 네트워크가 연결되어 있을 때만 작업이 수행되도록 조건을 설정합니다.

 

import androidx.work.Constraints
import androidx.work.NetworkType
import androidx.work.OneTimeWorkRequest
import androidx.work.WorkManager

// 네트워크 연결이 필요한 조건을 설정합니다.
val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .build()

// 작업 요청을 생성합니다.
val syncDataWorkRequest = OneTimeWorkRequest.Builder(DataSyncWorker::class.java)
    .setConstraints(constraints)
    .build()

// WorkManager에 작업을 등록합니다.
WorkManager.getInstance(context).enqueue(syncDataWorkRequest)

 

 

 

 

반응형

댓글