WorkManager 작업 진행률 관찰

최대환·2024년 1월 1일
0

WorkManager를 활용하면 백그라운드 작업의 진행률을 표시해줄수 있습니다. 단 이 과정에서 개발자가 직접 진행률을 계산하고 업데이트해야합니다. 아래는 전체 파일의 크기와 현재까지 다운로드 된 크기의 데이터를 이용하여 진행률을 계산하는 방식입니다.

val totalSize = /* 전체 파일 크기 */
val downloadedSize = /* 현재까지 다운로드한 데이터의 크기 */

val progressPercent = (downloadedSize / totalSize) * 100

이렇게 계산된 진행률을 setProgress() 함수를 이용하여 업데이트합니다. 아래 코드는 진행률을 업데이트하는 예시입니다.

class WorkManagerTest(context : Context, params : WorkerParameters) : CoroutineWorker(context, params) {

    companion object {
        const val HowMuch = "progress"
    }

    override suspend fun doWork(): Result {

        // i -> 1,2,3,4,5,6,7,8,9,10 / 10 20 30 40 .. 100
        for(i in 1..10) {
            val totalSize = 10.0
            val downloadedSize = i.toDouble()
            val progressPercent = ((downloadedSize / totalSize) * 100).toInt()

            val result = workDataOf(HowMuch to progressPercent)
            setProgress(result)
            delay(1000)
        }

        return Result.success()

    }

}

그리고 WorkManager에서 getWorkInfoByIdLiveData() 메소드를 사용하여 해당 작업의 WorkInfo를 가져와 관찰할 수 있습니다. WorkInfo 객체는 LiveData로 반환되며, 이를 통해 작업 상태와 진행률을 실시간으로 알 수 있습니다.

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val workManagerTest = OneTimeWorkRequestBuilder<WorkManagerTest>().build()
        WorkManager.getInstance(this).enqueue(workManagerTest)

        WorkManager.getInstance(this)
            .getWorkInfoByIdLiveData(workManagerTest.id)
            .observe(this, Observer { workInfo : WorkInfo? ->
                val progress = workInfo?.progress
                val value = progress?.getInt(HowMuch, 0)
                if(value != 0) {
                    Log.d("MainActivity", value.toString())
                }
                if(value == 100) {
                    Log.d("MainActivity", "이제 끝끝")
                }
            })

    }
}

이렇게 WorkManager를 이용하면 백그라운드에서 실행되는 작업의 상태를 실시간으로 확인할수있습니다.

profile
나의 개발지식 output 공간

0개의 댓글