Menentukan Permintaan Pekerjaan

Panduan memulai mencakup cara membuat WorkRequest sederhana dan mengantrekannya.

Dalam panduan ini, Anda akan belajar cara menyesuaikan permintaan pekerjaan untuk menangani kasus penggunaan umum:

  • Menangani batasan tugas seperti ketersediaan jaringan
  • Menjamin penundaan minimum dalam eksekusi tugas
  • Menangani proses percobaan ulang dan back-off tugas
  • Menangani input & output tugas
  • Mengelompokkan tugas dengan pemberian tag

Batasan pekerjaan

Anda bisa menambahkan Constraints untuk pekerjaan guna menunjukkan kapan pekerjaan tersebut dapat dijalankan.

Misalnya, Anda dapat menentukan agar pekerjaan hanya berjalan saat perangkat menganggur dan tersambung ke daya listrik.

Kode di bawah ini menunjukkan cara menambahkan batasan ini ke OneTimeWorkRequest. Untuk daftar lengkap batasan yang didukung, lihat dokumentasi referensi Constraints.Builder.

Kotlin


    // Create a Constraints object that defines when the task should run
    val constraints = Constraints.Builder()
            .setRequiresDeviceIdle(true)
            .setRequiresCharging(true)
            .build()

    // ...then create a OneTimeWorkRequest that uses those constraints
    val compressionWork = OneTimeWorkRequestBuilder<CompressWorker>()
            .setConstraints(constraints)
            .build()

    

Java

    // Create a Constraints object that defines when the task should run
    Constraints constraints = new Constraints.Builder()
        .setRequiresDeviceIdle(true)
        .setRequiresCharging(true)
         .build();

    // ...then create a OneTimeWorkRequest that uses those constraints
    OneTimeWorkRequest compressionWork =
                    new OneTimeWorkRequest.Builder(CompressWorker.class)
         .setConstraints(constraints)
         .build();
    

Jika beberapa batasan ditentukan, tugas hanya akan berjalan jika semua batasan terpenuhi.

Jika batasan gagal saat tugas berjalan, WorkManager akan menghentikan worker Anda. Setelah itu, tugas akan dicoba lagi jika batasan ini terpenuhi.

Penundaan Awal

Jika pekerjaan Anda tidak memiliki batasan atau semua batasan terpenuhi saat pekerjaan diantrekan, sistem dapat memilih untuk langsung menjalankan tugas ini. Jika tidak ingin tugas dijalankan langsung, Anda dapat menentukan pekerjaan agar dimulai setelah penundaan awal minimum.

Berikut adalah contoh cara menetapkan tugas agar berjalan minimal 10 menit setelah diantrekan.

Kotlin


    val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .setInitialDelay(10, TimeUnit.MINUTES)
            .build()

    

Java


    OneTimeWorkRequest uploadWorkRequest = new OneTimeWorkRequest.Builder(UploadWorker.class)
            .setInitialDelay(10, TimeUnit.MINUTES)
            .build();

    

Kebijakan Percobaan Ulang dan Backoff

Jika mengharuskan WorkManager mencoba kembali tugas Anda, Result.retry() bisa Anda tampilkan dari pekerja.

Pekerjaan Anda nantinya akan dijadwalkan ulang dengan kebijakan dan penundaan backoff default. Penundaan backoff menentukan jumlah waktu tunggu minimum sebelum mencoba kembali pekerjaan tersebut. Kebijakan backoff mendefinisikan cara penundaan backoff akan meningkat dari waktu ke waktu untuk upaya percobaan ulang berikut; hal ini bersifat EXPONENTIAL secara default.

Berikut adalah contoh penyesuaian kebijakan dan penundaan backoff.

Kotlin


    val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .setBackoffCriteria(
                    BackoffPolicy.LINEAR,
                    OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
                    TimeUnit.MILLISECONDS)
            .build()

    

Java


    OneTimeWorkRequest uploadWorkRequest =
        new OneTimeWorkRequest.Builder(UploadWorker.class)
            .setBackoffCriteria(
                    BackoffPolicy.LINEAR,
                    OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
                    TimeUnit.MILLISECONDS)
            .build();
    

Menentukan input/output untuk tugas

Tugas Anda mungkin memerlukan data untuk diteruskan sebagai parameter input atau ditampilkan sebagai hasilnya. Misalnya, tugas yang menangani upload image memerlukan URI image untuk diupload sebagai input dan mungkin memerlukan URL image yang diupload sebagai outputnya.

Nilai input dan output disimpan sebagai key-value pair dalam objek Data. Kode di bawah ini menunjukkan cara menyetel data input pada WorkRequest.

Kotlin


    // workDataOf (part of KTX) converts a list of pairs to a [Data] object.
    val imageData = workDataOf(Constants.KEY_IMAGE_URI to imageUriString)

    val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
            .setInputData(imageData)
            .build()

    

Java


    Data imageData = new Data.Builder()
                    .putString(Constants.KEY_IMAGE_URI, imageUriString)
                    .build();

    OneTimeWorkRequest uploadWorkRequest = new OneTimeWorkRequest.Builder(UploadWorker.class)
            .setInputData(imageData)
            .build();
    

Class Worker dapat mengakses argumen input dengan memanggil Worker.getInputData().

Demikian pula, class Data dapat digunakan untuk menghasilkan nilai yang ditampilkan. Tampilkan objek Data dengan menyertakannya dalam Result pada Result.success() atau Result.failure(), seperti yang ditunjukkan di bawah ini.

Kotlin

    class UploadWorker(appContext: Context, workerParams: WorkerParameters)
        : Worker(appContext, workerParams) {

        override fun doWork(): Result {

                // Get the input
                val imageUriInput = getInputData().getString(Constants.KEY_IMAGE_URI)
                // TODO: validate inputs.
                // Do the work
                val response = uploadFile(imageUriInput)

                // Create the output of the work
                val outputData = workDataOf(Constants.KEY_IMAGE_URL to response.imageUrl)

                // Return the output
                return Result.success(outputData)

        }
    }

    

Java

    public class UploadWorker extends Worker {

        public UploadWorker(
            @NonNull Context context,
            @NonNull WorkerParameters params) {
            super(context, params);
        }

        @Override
        public Result doWork() {

            // Get the input
            String imageUriInput =
                    getInputData().getString(Constants.KEY_IMAGE_URI);
            // TODO: validate inputs.
            // Do the work
            Response response = uploadFile(imageUriInput);

            // Create the output of the work
            Data outputData = new Data.Builder
                    .putString(Constants.KEY_IMAGE_URL, response.imageUrl)
                    .build();

            // Return the output
            return Result.success(outputData);
        }
    }
    

Memberi tag pekerjaan

Anda dapat mengelompokkan tugas secara logis dengan menetapkan string tag ke objek WorkRequest mana pun. Hal ini memungkinkan Anda mengoperasikan semua tugas dengan tag tertentu.

Misalnya, WorkManager.cancelAllWorkByTag(String) membatalkan semua tugas dengan tag tertentu, dan WorkManager.getWorkInfosByTagLiveData(String) menampilkan LiveData dengan daftar status semua tugas dengan tag tersebut.

Kode berikut menunjukkan cara menambahkan tag "pembersihan" ke tugas Anda dengan WorkRequest.Builder.addTag(String):

Kotlin

    val cacheCleanupTask =
            OneTimeWorkRequestBuilder<CacheCleanupWorker>()
        .setConstraints(constraints)
        .addTag("cleanup")
        .build()
    

Java

    OneTimeWorkRequest cacheCleanupTask =
            new OneTimeWorkRequest.Builder(CacheCleanupWorker.class)
        .setConstraints(constraints)
        .addTag("cleanup")
        .build();