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를 이용하면 백그라운드에서 실행되는 작업의 상태를 실시간으로 확인할수있습니다.