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
เมื่อมีการสิ้นสุดงานโดยไม่คาดคิดได้ที่สังเกตสถานะเหตุผลการหยุด