WorkManager memungkinkan Anda membuat dan mengantrekan rantai pekerjaan yang menentukan beberapa tugas dependen, serta menetapkan urutan kerjanya. Fungsi ini sangat berguna saat Anda perlu menjalankan beberapa tugas dalam urutan tertentu.
Untuk membuat rantai pekerjaan, Anda dapat menggunakan
WorkManager.beginWith(OneTimeWorkRequest)
atau
WorkManager.beginWith(List<OneTimeWorkRequest>)
,
yang masing-masing menampilkan instance
WorkContinuation
.
WorkContinuation
kemudian dapat digunakan untuk menambahkan instance OneTimeWorkRequest
dependen menggunakan
then(OneTimeWorkRequest)
atau
then(List<OneTimeWorkRequest>)
.
Setiap pemanggilan WorkContinuation.then(...)
, akan menampilkan instance WorkContinuation
baru. Jika Anda menambahkan List
OneTimeWorkRequest
,
permintaan ini dapat berpotensi berjalan secara paralel.
Terakhir, Anda dapat menggunakan metode
WorkContinuation.enqueue()
untuk enqueue()
rantai WorkContinuation
.
Perhatikan contoh berikut. Dalam contoh ini, 3 tugas Pekerja berbeda dikonfigurasi untuk dijalankan (kemungkinan secara paralel). Hasil Pekerja tersebut kemudian digabungkan dan diteruskan ke tugas Pekerja dalam cache. Terakhir, output dari tugas tersebut diteruskan ke Pekerja upload, yang mengupload hasilnya ke server jarak jauh.
Kotlin
WorkManager.getInstance(myContext) // Candidates to run in parallel .beginWith(listOf(plantName1, plantName2, plantName3)) // Dependent work (only runs after all previous work in chain) .then(cache) .then(upload) // Call enqueue to kick things off .enqueue()
Java
WorkManager.getInstance(myContext) // Candidates to run in parallel .beginWith(Arrays.asList(plantName1, plantName2, plantName3)) // Dependent work (only runs after all previous work in chain) .then(cache) .then(upload) // Call enqueue to kick things off .enqueue();
Gabungan Input
Saat Anda membuat rantai OneTimeWorkRequest
instance, output permintaan pekerjaan induk akan
diteruskan sebagai input ke turunan. Jadi, dalam
contoh di atas, output plantName1
, plantName2
, dan plantName3
akan
diteruskan sebagai input ke permintaan cache
.
Untuk mengelola input dari beberapa permintaan pekerjaan induk, WorkManager menggunakan
InputMerger
.
Ada dua jenis InputMerger
yang disediakan oleh WorkManager:
OverwritingInputMerger
mencoba menambahkan semua kunci dari semua input ke output. Hal ini akan menimpa kunci yang telah disetel sebelumnya jika terjadi konflik.ArrayCreatingInputMerger
mencoba menggabungkan input, yang membuat array jika perlu.
Jika memiliki kasus penggunaan yang lebih spesifik, Anda dapat menulis sendiri dengan subclass
InputMerger
.
OverwritingInputMerger
OverwritingInputMerger
adalah metode penggabungan default. Jika ada konflik
kunci dalam penggabungan, nilai terbaru untuk kunci akan menimpa
versi sebelumnya dalam data output yang dihasilkan.
Misalnya, jika masing-masing input tanaman memiliki kunci yang cocok dengan nama
variabel masing-masing ("plantName1"
, "plantName2"
, dan "plantName3"
),
data yang diteruskan ke cache
pekerja akan memiliki tiga kunci pasangan nilai.
Jika ada konflik, pekerja terakhir yang menyelesaikan “menang”, dan nilainya
diteruskan ke cache
.
Karena permintaan pekerjaan dijalankan secara paralel, Anda tidak memiliki jaminan untuk
urutan yang menjalankannya. Pada contoh di atas, plantName1
dapat menyimpan
nilai "tulip"
atau "elm"
, bergantung pada nilai yang terakhir
ditulis. Jika Anda memiliki peluang konflik utama dan Anda perlu mempertahankan semua data
output dalam penggabungan, ArrayCreatingInputMerger
mungkin merupakan opsi yang lebih baik.
ArrayCreatingInputMerger
Untuk contoh di atas, jika ingin mempertahankan output dari semua Pekerja
nama tumbuhan, kita harus menggunakan ArrayCreatingInputMerger
.
Kotlin
val cache: OneTimeWorkRequest = OneTimeWorkRequestBuilder<PlantWorker>() .setInputMerger(ArrayCreatingInputMerger::class) .setConstraints(constraints) .build()
Java
OneTimeWorkRequest cache = new OneTimeWorkRequest.Builder(PlantWorker.class) .setInputMerger(ArrayCreatingInputMerger.class) .setConstraints(constraints) .build();
ArrayCreatingInputMerger
menghubungkan setiap kunci dengan array. Jika masing-masing kunci
bersifat unik, maka hasilnya adalah rangkaian array satu elemen.
Jika ada konflik kunci, nilai apa pun yang sesuai akan dikelompokkan bersama dalam array.
Status Pekerjaan dan Perantaian
Rantai OneTimeWorkRequest
dijalankan secara berurutan selama pekerjaannya
berhasil diselesaikan (yaitu, mereka mengembalikan Result.success()
). permintaan
Pekerjaan mungkin gagal atau dibatalkan saat berjalan, yang memiliki efek downstream pada
permintaan pekerjaan dependen.
Saat OneTimeWorkRequest
pertama diantrekan dalam rantai permintaan pekerjaan,
semua permintaan pekerjaan berikutnya diblokir hingga pekerjaan dari permintaan
pekerjaan pertama tersebut selesai.
Setelah diantrekan dan semua batasan pekerjaan terpenuhi, permintaan pekerjaan pertama
akan berjalan. Jika pekerjaan berhasil diselesaikan dalam root
OneTimeWorkRequest
atau List<OneTimeWorkRequest>
(artinya, itu mengembalikan
Result.success()
), maka set permintaan pekerjaan dependen berikutnya akan
diantrekan.
Selama setiap permintaan pekerjaan berhasil diselesaikan, pola yang sama tersebut tetap berlaku di seluruh rantai permintaan pekerjaan Anda hingga semua pekerjaan dalam rantai tersebut selesai. Meskipun ini adalah kasus yang paling sederhana dan sering dipilih, status error sama pentingnya untuk ditangani.
Jika terjadi error saat pekerja memproses permintaan kerja, Anda dapat mencoba kembali permintaan tersebut sesuai dengan kebijakan backoff yang Anda tentukan. Mencoba lagi permintaan yang merupakan bagian dari rantai berarti bahwa hanya permintaan tersebut yang akan dicoba lagi dengan data input yang diberikan. Setiap pekerjaan yang berjalan secara paralel tidak akan terpengaruh.
Untuk mengetahui informasi lebih lanjut cara menentukan strategi percobaan ulang kustom, lihat Kebijakan Percobaan Ulang dan Backoff.
Jika kebijakan percobaan ulang tidak ditentukan atau habis, atau Anda mencapai beberapa
keadaan saat OneTimeWorkRequest
menampilkan Result.failure()
, maka permintaan kerja dan semua
permintaan pekerjaan dependen akan ditandai sebagai FAILED.
Logika yang sama berlaku saat OneTimeWorkRequest
dibatalkan. Semua
permintaan pekerjaan dependen juga ditandai CANCELLED
dan tugasnya tidak akan dijalankan.
Perlu diketahui bahwa jika Anda menambahkan lebih banyak permintaan pekerjaan ke rantai yang telah gagal atau
telah membatalkan permintaan pekerjaan, permintaan pekerjaan yang baru saja ditambahkan juga akan
ditandai FAILED
atau CANCELLED
. Jika Anda ingin memperluas pekerjaan rantai yang sudah ada, lihat APPEND_OR_REPLACE
di
ExistWorkPolicy.
Saat membuat rantai permintaan pekerjaaan, permintaan pekerjaan dependen harus menentukan kebijakan coba lagi untuk memastikan bahwa pekerjaan selalu diselesaikan pada waktu yang tepat. Permintaan pekerjaan yang gagal dapat menyebabkan rantai yang tidak lengkap dan/atau status tidak terduga.
Untuk informasi selengkapnya, lihat Membatalkan dan Menghentikan Pekerjaan.