สังเกตความคืบหน้าของผู้ปฏิบัติงานระดับกลาง

WorkManager มีการรองรับในตัวสำหรับการตั้งค่าและสังเกตความคืบหน้าระหว่างกลางสำหรับ Worker หาก Worker ทำงานขณะที่แอปอยู่ในเบื้องหน้า ระบบจะแสดงข้อมูลนี้ต่อผู้ใช้ได้ด้วย API ที่แสดง LiveData ของ WorkInfo

ListenableWorker รองรับ API setProgressAsync() แล้ว ซึ่งช่วยให้เก็บความคืบหน้าชั่วคราวได้ API เหล่านี้ช่วยให้ นักพัฒนาแอปตั้งค่าความคืบหน้าระดับกลางที่ UI สังเกตได้ ความคืบหน้าแสดงด้วยประเภท Data ซึ่งเป็นคอนเทนเนอร์ของพร็อพเพอร์ตี้ที่สามารถแปลงเป็นอนุกรมได้ (คล้ายกับ input และ output และอยู่ภายใต้ข้อจำกัดเดียวกัน)

คุณจะดูและอัปเดตข้อมูลความคืบหน้าได้ขณะที่ ListenableWorker ทำงานอยู่เท่านั้น ระบบจะไม่สนใจความพยายามในการตั้งค่าความคืบหน้าใน ListenableWorker หลังจากที่ดำเนินการเสร็จสมบูรณ์แล้ว

นอกจากนี้ คุณยังดูข้อมูลความคืบหน้าได้โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้ getWorkInfoBy…() หรือ getWorkInfoBy…LiveData() เมธอดเหล่านี้จะแสดงอินสแตนซ์ของ WorkInfo ซึ่งมีเมธอด getProgress() ใหม่ ที่แสดง Data

ความคืบหน้าในการอัปเดต

สำหรับนักพัฒนาซอฟต์แวร์ Java ที่ใช้ ListenableWorker หรือ Worker API setProgressAsync() จะแสดงผล ListenableFuture<Void> การอัปเดตความคืบหน้าเป็นแบบอะซิงโครนัส เนื่องจากกระบวนการอัปเดตเกี่ยวข้องกับการจัดเก็บข้อมูลความคืบหน้าในฐานข้อมูล ใน Kotlin คุณสามารถใช้ฟังก์ชันส่วนขยาย CoroutineWorker ของออบเจ็กต์ setProgress() เพื่ออัปเดตข้อมูลความคืบหน้า

ตัวอย่างนี้แสดง ProgressWorker Worker จะตั้งค่าความคืบหน้าเป็น 0 เมื่อเริ่มทำงาน และเมื่อเสร็จสมบูรณ์แล้วจะอัปเดตค่าความคืบหน้าเป็น 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();
    }
}

การสังเกตความคืบหน้า

หากต้องการดูข้อมูลความคืบหน้า ให้ใช้วิธีการ getWorkInfoById และรับข้อมูลอ้างอิงถึง WorkInfo

ต่อไปนี้คือตัวอย่างที่ใช้ getWorkInfoByIdFlow สำหรับ Kotlin และ getWorkInfoByIdLiveData สำหรับ 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
             }
      }
});

อ่านข้อมูลเพิ่มเติมเกี่ยวกับเอกสารประกอบในการสังเกตWorkerออบเจ็กต์ได้ที่หัวข้อ สถานะงานและการสังเกตงาน ดูวิธีรับ stopReason เมื่อมีการสิ้นสุดงานโดยไม่คาดคิดได้ที่สังเกตสถานะเหตุผลการหยุด