WorkManager memungkinkan Anda mengupdate WorkRequest
setelah Anda
menambahkannya ke dalam antrean. Hal ini sering diperlukan dalam aplikasi yang lebih besar yang sering berubah
kendala atau perlu memperbarui
karyawan mereka dengan cepat. Mulai WorkManager
versi 2.8.0, updateWork()
API adalah cara untuk melakukannya.
Metode updateWork()
memungkinkan Anda mengubah aspek tertentu dari
WorkRequest
dengan cepat, tanpa harus melalui proses manual
membatalkan dan mengantrekan yang baru. Hal ini sangat menyederhanakan pengembangan
{i>checkout<i}.
Menghindari pembatalan pekerjaan
Secara umum, Anda harus menghindari pembatalan WorkRequest yang ada dan mengantrekan WorkRequest yang baru satu. Hal ini dapat menyebabkan aplikasi mengulangi tugas tertentu, dan dapat mengharuskan Anda untuk menulis sejumlah besar kode tambahan.
Pertimbangkan contoh berikut yang dapat menyebabkan pembatalan WorkRequest kesulitan:
- Permintaan backend: Jika Anda membatalkan
Worker
saat melakukan komputasi payload untuk dikirim ke server,Worker
baru harus dimulai dari awal dan menghitung ulang {i>payload<i} yang berpotensi mahal. - Penjadwalan: Jika Anda membatalkan
PeriodicWorkRequest
dan ingin sepertiPeriodicWorkRequest
baru untuk dijalankan pada jadwal yang sama, Anda harus untuk menghitung selisih waktu guna memastikan waktu eksekusi yang baru selaras dengan permintaan pekerjaan sebelumnya.
API updateWork()
memungkinkan Anda memperbarui batasan permintaan pekerjaan dan
parameter lain tanpa kesulitan membatalkan
dan mengantrekan permintaan baru.
Kapan harus membatalkan pekerjaan
Ada kalanya Anda harus langsung membatalkan WorkRequest
, bukan
panggil updateWork()
. Inilah yang harus Anda lakukan bila ingin mengubah
sifat dasar pekerjaan yang telah Anda antreankan.
Kapan harus memperbarui pekerjaan
Bayangkan sebuah aplikasi foto yang mencadangkan foto pengguna setiap hari. Memiliki
mengantrekan PeriodicWorkRequest
untuk melakukannya. WorkRequest
memiliki batasan
yang membutuhkan perangkat untuk diisi
daya dan terhubung ke WiFi.
Namun, pengguna hanya mengisi daya perangkatnya selama 20 menit sehari menggunakan
ke pengisi daya. Dalam hal ini, aplikasi mungkin ingin mengupdate WorkRequest
untuk melonggarkan
batasan pengisian daya, sehingga foto tetap dapat diupload meskipun perangkat
tidak terisi penuh.
Dalam situasi ini, Anda dapat menggunakan metode updateWork()
untuk memperbarui pekerjaan
permintaan batasan.
Cara memperbarui alamat kantor
Metode updateWork()
memberikan cara mudah untuk memperbarui
WorkRequest
, tanpa harus membatalkan dan mengantrekan yang baru.
Untuk menggunakan update pekerjaan yang diantrekan, ikuti langkah-langkah berikut:
- Mendapatkan ID yang ada untuk pekerjaan dalam antrean: Dapatkan ID WorkRequest yang Anda
ingin memperbarui. Anda dapat mengambil ID ini dengan
getWorkInfo
API, atau dengan mempertahankan ID dari WorkRequest untuk pengambilan nanti dengan properti publikWorkRequest.id
, sebelum mengantrekannya. - Membuat WorkRequest baru: Membuat
WorkRequest
baru dan menggunakanWorkRequest.Builder.setID()
untuk menetapkan ID-nya agar cocok dengan yang sudah adaWorkRequest
. - Tetapkan batasan: Gunakan
WorkRequest.Builder.setConstraints()
untuk meneruskan Batasan baru WorkManager. - Call updateWork: Meneruskan WorkRequest baru ke
updateWork()
.
Memperbarui contoh pekerjaan
Berikut adalah contoh cuplikan kode di Kotlin yang menunjukkan cara menggunakan
Metode updateWork()
untuk mengubah batasan baterai WorkRequest
yang digunakan
untuk mengunggah foto:
suspend fun updatePhotoUploadWork() {
// Get instance of WorkManager.
val workManager = WorkManager.getInstance(context)
// Retrieve the work request ID. In this example, the work being updated is unique
// work so we can retrieve the ID using the unique work name.
val photoUploadWorkInfoList = workManager.getWorkInfosForUniqueWork(
PHOTO_UPLOAD_WORK_NAME
).await()
val existingWorkRequestId = photoUploadWorkInfoList.firstOrNull()?.id ?: return
// Update the constraints of the WorkRequest to not require a charging device.
val newConstraints = Constraints.Builder()
// Add other constraints as required here.
.setRequiresCharging(false)
.build()
// Create new WorkRequest from existing Worker, new constraints, and the id of the old WorkRequest.
val updatedWorkRequest: WorkRequest =
OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(newConstraints)
.setId(existingWorkRequestId)
.build()
// Pass the new WorkRequest to updateWork().
workManager.updateWork(updatedWorkRequest)
}
Menangani hasil
updateWork()
menampilkan ListenableFuture<UpdateResult>
. Hal yang diberikan
UpdateResult
dapat memiliki salah satu dari beberapa nilai yang menguraikan apakah
WorkManager dapat menerapkan perubahan Anda. Hal ini juga menunjukkan
kapan komputer itu mampu
untuk menerapkan perubahan.
Untuk informasi selengkapnya, lihat updateWork()
dan UpdateResult
referensi.
Pantau pekerjaan dengan berbagai generasi
Setiap kali Anda mengupdate WorkRequest
, pembuatannya akan bertambah satu. Ini
memungkinkan Anda melacak dengan tepat WorkRequest
mana yang saat ini diantrekan.
Pembuatan generasi memberi Anda lebih banyak kontrol saat mengamati, melacak, dan menguji tugas
permintaan.
Untuk mendapatkan pembuatan WorkRequest
, ikuti langkah-langkah berikut:
- WorkInfo: Panggil
WorkManager.getWorkInfoById()
untuk mengambil instance dariWorkInfo
yang sesuai denganWorkRequest
Anda.- Anda dapat memanggil salah satu dari beberapa metode yang menampilkan
WorkInfo
. Untuk selengkapnya Lihat referensi WorkManager.
- Anda dapat memanggil salah satu dari beberapa metode yang menampilkan
- getGeneration: Panggil
getGeneration()
pada instanceWorkInfo
.Int
yang ditampilkan sesuai dengan pembuatanWorkRequest
.- Perlu diketahui bahwa tidak ada kolom atau properti pembuatan, hanya
Metode
WorkInfo.getGeneration()
.
- Perlu diketahui bahwa tidak ada kolom atau properti pembuatan, hanya
Metode
Contoh pembuatan jalur
Berikut ini adalah contoh implementasi alur kerja yang dijelaskan di atas untuk
mengambil pembuatan WorkRequest
.
// Get instance of WorkManager.
val workManager = WorkManager.getInstance(context)
// Retrieve WorkInfo instance.
val workInfo = workManager.getWorkInfoById(oldWorkRequestId)
// Call getGeneration to retrieve the generation.
val generation = workInfo.getGeneration()
Kebijakan untuk memperbarui pekerjaan
Sebelumnya, solusi yang direkomendasikan untuk memperbarui pekerjaan berkala adalah mengantrekan
PeriodicWorkRequest
dengan kebijakan ExistingPeriodicWorkPolicy.REPLACE
.
Jika ada PeriodicWorkRequest
yang tertunda dengan id
unik yang sama,
permintaan pekerjaan akan
membatalkan dan menghapusnya. Kebijakan ini sekarang tidak digunakan lagi di
mendukung alur kerja menggunakan ExistingPeriodicWorkPolicy.UPDATE
.
Misalnya, saat menggunakan enqueueUniquePeriodicWork
dengan
PeriodicWorkRequest
, Anda dapat menginisialisasi PeriodicWorkRequest
baru dengan
kebijakan ExistingPeriodicWorkPolicy.UPDATE
. Jika terdapat permintaan
PeriodicWorkRequest
dengan nama unik yang sama, WorkManager memperbaruinya ke
spesifikasi baru. Dengan mengikuti alur kerja ini, Anda tidak perlu
updateWork()
.