Google berkomitmen untuk mendorong terwujudnya keadilan rasial bagi komunitas Kulit Hitam. Lihat caranya.

Perantaian Pekerjaan

Pengantar

WorkManager memungkinkan Anda membuat dan mengantrekan rantai pekerjaan yang menentukan beberapa tugas dependen, serta menetapkan urutan kerjanya. Hal ini akan 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 menampilkan instance WorkContinuation.

WorkContinuation nantinya dapat digunakan untuk menambahkan OneTimeWorkRequest dependen menggunakan WorkContinuation.then(OneTimeWorkRequest) atau WorkContinuation.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 Anda.

Mari kita lihat contoh aplikasi menjalankan filter gambar pada 3 gambar yang berbeda (berpotensi paralel), kemudian mengompresi gambar tersebut, lalu menguploadnya.

Kotlin

    WorkManager.getInstance(myContext)
        // Candidates to run in parallel
        .beginWith(listOf(filter1, filter2, filter3))
        // Dependent work (only runs after all previous work in chain)
        .then(compress)
        .then(upload)
        // Don't forget to enqueue()
        .enqueue()

    

Java

    WorkManager.getInstance(myContext)
        // Candidates to run in parallel
        .beginWith(Arrays.asList(filter1, filter2, filter3))
        // Dependent work (only runs after all previous work in chain)
        .then(compress)
        .then(upload)
        // Don't forget to enqueue()
        .enqueue();

    

Gabungan Masukan

Ketika menggunakan rantai OneTimeWorkRequest, output OneTimeWorkRequest induk akan diteruskan sebagai input ke turunannya. Jadi, dalam contoh di atas, output filter1, filter2, dan filter3 akan diteruskan sebagai input ke permintaan compress.

Untuk mengelola input dari beberapa OneTimeWorkRequest induk, WorkManager menggunakan InputMerger.

Berikut adalah 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.

Untuk contoh di atas, jika ingin mempertahankan output dari semua filter gambar, kita harus menggunakan ArrayCreatingInputMerger.

Kotlin

    val compress: OneTimeWorkRequest = OneTimeWorkRequestBuilder<CompressWorker>()
        .setInputMerger(ArrayCreatingInputMerger::class)
        .setConstraints(constraints)
        .build()

    

Java

    OneTimeWorkRequest compress =
        new OneTimeWorkRequest.Builder(CompressWorker.class)
            .setInputMerger(ArrayCreatingInputMerger.class)
            .setConstraints(constraints)
            .build();

    

Status Pekerjaan dan Perantaian

Ada beberapa hal yang perlu diingat saat membuat rantai OneTimeWorkRequest.

  • OneTimeWorkRequest dependen hanya dibatalkan pemblokirannya (transisi ke ENQUEUED) jika semua OneTimeWorkRequest induknya berhasil (jika menampilkan Result.success()).

  • Jika ada OneTimeWorkRequest induk yang gagal (menampilkan Result.failure()), semua OneTimeWorkRequest dependen juga akan ditandai sebagai FAILED.

  • Jika ada OneTimeWorkRequest induk yang dibatalkan, semua OneTimeWorkRequest dependen juga akan ditandai sebagai CANCELLED.

Untuk informasi selengkapnya, lihat Membatalkan dan Menghentikan Pekerjaan.