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

WorkManager มีการสนับสนุนชั้นหนึ่งสำหรับการตั้งค่าและการเฝ้าสังเกตระดับกลาง สำหรับผู้ปฏิบัติงาน หากผู้ปฏิบัติงานกำลังทำงานขณะที่แอปทำงานอยู่ เบื้องหน้า ข้อมูลนี้สามารถแสดงแก่ผู้ใช้โดยใช้ API ที่ ส่งคืน LiveData ของ WorkInfo

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

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

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

สำหรับนักพัฒนาซอฟต์แวร์ Java ที่ใช้ ListenableWorker หรือ Worker ค่า setProgressAsync() API แสดงผล 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();
    }
}

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

การสังเกตข้อมูลความคืบหน้าก็ทำได้ง่ายเช่นกัน คุณสามารถใช้ getWorkInfoBy…() หรือ getWorkInfoBy…LiveData() และอ้างอิงไปที่ WorkInfo

นี่คือตัวอย่างที่ใช้ getWorkInfoByIdLiveData API

Kotlin

WorkManager.getInstance(applicationContext)
    // requestId is the WorkRequest id
    .getWorkInfoByIdLiveData(requestId)
    .observe(observer, Observer { 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 สถานะการทำงานและการสังเกตการณ์งาน