WorkManager memiliki dukungan kelas satu untuk menetapkan dan mengamati
progres tingkat menengah untuk beberapa pekerja. Jika pekerja berjalan saat aplikasi berada di
latar depan, informasi ini juga dapat ditampilkan kepada pengguna menggunakan API
yang menampilkan LiveData
dari WorkInfo
.
ListenableWorker
sekarang mendukung
setProgressAsync()
API, yang memungkinkannya mempertahankan progres tingkat menengah. API ini memungkinkan
developer menetapkan progres tingkat menengah yang dapat diamati oleh UI.
Progress direpresentasikan oleh jenis Data
,
yang merupakan container yang dapat diserialkan untuk berbagai properti (mirip dengan input
dan
output
, dan tunduk pada pembatasan yang sama).
Informasi progres hanya dapat dilihat dan diperbarui
saat ListenableWorker
berjalan. Upaya menetapkan progres
pada ListenableWorker
setelah menyelesaikan eksekusi akan diabaikan. Anda juga dapat mengamati informasi progres dengan menggunakan salah satu metode getWorkInfoBy…()
atau
getWorkInfoBy…LiveData()
.
Metode ini menampilkan
instance WorkInfo
, yang memiliki
metode getProgress()
baru
yang menampilkan Data
.
Progres Pembaruan
Untuk developer Java yang menggunakan ListenableWorker
atau Worker
,
setProgressAsync()
API yang menampilkan ListenableFuture<Void>
; pembaruan progres bersifat asinkron,
mengingat proses pembaruan ini melibatkan penyimpanan informasi progres dalam database.
Di Kotlin, Anda dapat menggunakan fungsi ekstensi setProgress()
objek
CoroutineWorker
untuk memperbarui informasi progres.
Contoh ini menunjukkan ProgressWorker
sederhana. Worker
menetapkan progresnya ke
0 saat dimulai, dan begitu selesai akan memperbarui nilai progres ke 100.
Kotlin
import android.content.Context import androidx.work.CoroutineWorker import androidx.work.Data import androidx.work.WorkerParameters import kotlinx.coroutines.delay class ProgressWorker(context: Context, parameters: WorkerParameters) : CoroutineWorker(context, parameters) { companion object { const val Progress = "Progress" private const val delayDuration = 1L } override suspend fun doWork(): Result { val firstUpdate = workDataOf(Progress to 0) val lastUpdate = workDataOf(Progress to 100) setProgress(firstUpdate) delay(delayDuration) setProgress(lastUpdate) return Result.success() } }
Java
import android.content.Context; import androidx.annotation.NonNull; import androidx.work.Data; import androidx.work.Worker; import androidx.work.WorkerParameters; public class ProgressWorker extends Worker { private static final String PROGRESS = "PROGRESS"; private static final long DELAY = 1000L; public ProgressWorker( @NonNull Context context, @NonNull WorkerParameters parameters) { super(context, parameters); // Set initial progress to 0 setProgressAsync(new Data.Builder().putInt(PROGRESS, 0).build()); } @NonNull @Override public Result doWork() { try { // Doing work. Thread.sleep(DELAY); } catch (InterruptedException exception) { // ... handle exception } // Set progress to 100 after you are done doing your work. setProgressAsync(new Data.Builder().putInt(PROGRESS, 100).build()); return Result.success(); } }
Mengamati Progres
Mengamati informasi progres juga sangat mudah. Anda dapat menggunakan
metode getWorkInfoBy…()
atau getWorkInfoBy…LiveData()
, dan mendapatkan referensi ke WorkInfo
.
Berikut adalah contoh yang menggunakan getWorkInfoByIdLiveData
API.
Kotlin
WorkManager.getInstance(applicationContext) // requestId is the WorkRequest id .getWorkInfoByIdLiveData(requestId) .observe(observer, Observer { workInfo: WorkInfo? -> if (workInfo != null) { val progress = workInfo.progress val value = progress.getInt(Progress, 0) // Do something with progress information } })
Java
WorkManager.getInstance(getApplicationContext()) // requestId is the WorkRequest id .getWorkInfoByIdLiveData(requestId) .observe(lifecycleOwner, new Observer<WorkInfo>() { @Override public void onChanged(@Nullable WorkInfo workInfo) { if (workInfo != null) { Data progress = workInfo.getProgress(); int value = progress.getInt(PROGRESS, 0) // Do something with progress } } });
Untuk dokumentasi lainnya tentang mengamati objek Worker
, baca
Status Pekerjaan dan mengamati pekerjaan.