Memperbarui pekerjaan yang sudah ada dalam antrean

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 seperti PeriodicWorkRequest 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:

  1. 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 publik WorkRequest.id, sebelum mengantrekannya.
  2. Membuat WorkRequest baru: Membuat WorkRequest baru dan menggunakan WorkRequest.Builder.setID() untuk menetapkan ID-nya agar cocok dengan yang sudah ada WorkRequest.
  3. Tetapkan batasan: Gunakan WorkRequest.Builder.setConstraints() untuk meneruskan Batasan baru WorkManager.
  4. 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:

  1. WorkInfo: Panggil WorkManager.getWorkInfoById() untuk mengambil instance dari WorkInfo yang sesuai dengan WorkRequest Anda.
    • Anda dapat memanggil salah satu dari beberapa metode yang menampilkan WorkInfo. Untuk selengkapnya Lihat referensi WorkManager.
  2. getGeneration: Panggil getGeneration() pada instance WorkInfo. Int yang ditampilkan sesuai dengan pembuatan WorkRequest.
    • Perlu diketahui bahwa tidak ada kolom atau properti pembuatan, hanya Metode WorkInfo.getGeneration().

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().