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
สถานะการทำงานและการสังเกตการณ์งาน