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

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 หยุดทำงาน คุณสามารถบันทึกเหตุผลที่หยุดได้โดยเรียกใช้ WorkInfo.getStopReason() ดังนี้

Kotlin

workManager.getWorkInfoByIdFlow(syncWorker.id)
  .collect { workInfo ->
      if (workInfo != null) {
        val stopReason = workInfo.stopReason
        logStopReason(syncWorker.id, stopReason)
      }
  }

Java

  workManager.getWorkInfoByIdLiveData(syncWorker.id)
    .observe(getViewLifecycleOwner(), workInfo -> {
        if (workInfo != null) {
          int stopReason = workInfo.getStopReason();
          logStopReason(syncWorker.id, workInfo.getStopReason());
        }
  });

อ่านเอกสารประกอบเพิ่มเติมเกี่ยวกับวงจรการทำงานและสถานะของออบเจ็กต์ Worker ได้ที่ สถานะการทำงาน