Mengamati progres pekerja tingkat menengah

WorkManager memiliki dukungan bawaan untuk menetapkan dan mengamati progres tingkat menengah untuk beberapa pekerja. Jika pekerja berjalan saat aplikasi berada di latar depan, informasi ini juga dapat ditampilkan kepada pengguna menggunakan API yang menampilkan LiveData dari WorkInfo.

ListenableWorker sekarang mendukung setProgressAsync() API, yang memungkinkannya mempertahankan progres tingkat menengah. API ini memungkinkan developer menetapkan progres tingkat menengah yang dapat diamati oleh UI. Progress direpresentasikan oleh jenis Data, yang merupakan container yang dapat diserialkan untuk berbagai properti (mirip dengan input dan output, dan tunduk pada pembatasan yang sama).

Informasi progres hanya dapat dilihat dan diperbarui saat ListenableWorker berjalan. Upaya menetapkan progres pada ListenableWorker setelah menyelesaikan eksekusi akan diabaikan.

Anda juga dapat mengamati informasi progres dengan menggunakan salah satu metode getWorkInfoBy…() atau getWorkInfoBy…LiveData(). Metode ini menampilkan instance WorkInfo, yang memiliki metode getProgress() baru yang menampilkan Data.

Memperbarui Progres

Untuk developer Java yang menggunakan ListenableWorker atau Worker, setProgressAsync() API yang menampilkan ListenableFuture<Void>; pembaruan progres bersifat asinkron, mengingat proses pembaruan ini melibatkan penyimpanan informasi progres dalam database. Di Kotlin, Anda dapat menggunakan fungsi ekstensi setProgress() objek CoroutineWorker untuk memperbarui informasi progres.

Contoh ini menunjukkan ProgressWorker. Worker menetapkan progresnya ke 0 saat dimulai, dan begitu selesai akan memperbarui nilai progres ke 100.

Kotlin

import android.content.Context
import androidx.work.CoroutineWorker
import androidx.work.Data
import androidx.work.WorkerParameters
import kotlinx.coroutines.delay

class ProgressWorker(context: Context, parameters: WorkerParameters) :
    CoroutineWorker(context, parameters) {

    companion object {
        const val Progress = "Progress"
        private const val delayDuration = 1L
    }

    override suspend fun doWork(): Result {
        val firstUpdate = workDataOf(Progress to 0)
        val lastUpdate = workDataOf(Progress to 100)
        setProgress(firstUpdate)
        delay(delayDuration)
        setProgress(lastUpdate)
        return Result.success()
    }
}

Java

import android.content.Context;
import androidx.annotation.NonNull;
import androidx.work.Data;
import androidx.work.Worker;
import androidx.work.WorkerParameters;

public class ProgressWorker extends Worker {

    private static final String PROGRESS = "PROGRESS";
    private static final long DELAY = 1000L;

    public ProgressWorker(
        @NonNull Context context,
        @NonNull WorkerParameters parameters) {
        super(context, parameters);
        // Set initial progress to 0
        setProgressAsync(new Data.Builder().putInt(PROGRESS, 0).build());
    }

    @NonNull
    @Override
    public Result doWork() {
        try {
            // Doing work.
            Thread.sleep(DELAY);
        } catch (InterruptedException exception) {
            // ... handle exception
        }
        // Set progress to 100 after you are done doing your work.
        setProgressAsync(new Data.Builder().putInt(PROGRESS, 100).build());
        return Result.success();
    }
}

Mengamati Progres

Untuk mengamati informasi progres, gunakan metode getWorkInfoById, dan dapatkan referensi ke WorkInfo.

Berikut adalah contoh yang menggunakan getWorkInfoByIdFlow untuk Kotlin dan getWorkInfoByIdLiveData untuk Java.

Kotlin

WorkManager.getInstance(applicationContext)
      // requestId is the WorkRequest id
      .getWorkInfoByIdFlow(requestId)
      .collect { workInfo: WorkInfo? ->
          if (workInfo != null) {
              val progress = workInfo.progress
              val value = progress.getInt("Progress", 0)
              // Do something with progress information
          }
      }

Java

WorkManager.getInstance(getApplicationContext())
     // requestId is the WorkRequest id
     .getWorkInfoByIdLiveData(requestId)
     .observe(lifecycleOwner, new Observer<WorkInfo>() {
             @Override
             public void onChanged(@Nullable WorkInfo workInfo) {
                 if (workInfo != null) {
                     Data progress = workInfo.getProgress();
                     int value = progress.getInt(PROGRESS, 0)
                     // Do something with progress
             }
      }
});

Untuk dokumentasi lainnya tentang mengamati objek Worker, baca Status Pekerjaan dan mengamati pekerjaan. Untuk mempelajari cara mendapatkan stopReason saat tugas berakhir secara tidak terduga, lihat Mengamati status alasan penghentian.