WorkManager อนุญาตให้คุณอัปเดต WorkRequest
ได้หลังจาก
จัดคิวเลย วิธีนี้มักจำเป็นในแอปขนาดใหญ่ที่มักมีการเปลี่ยนแปลง
จำกัด หรือจำเป็นต้องอัปเดตพนักงานได้ในทันที ในฐานะของ WorkManager
เวอร์ชัน 2.8.0 updateWork()
API เป็นเครื่องมือหลักในการดำเนินการนี้
เมธอด updateWork()
ช่วยให้คุณเปลี่ยนแปลงลักษณะของ
WorkRequest
ได้ทันที โดยไม่ต้องทำขั้นตอนด้วยตนเอง
การยกเลิกและการจัดคิวใหม่ วิธีนี้ทำให้การพัฒนาง่ายขึ้นมาก
ขั้นตอนได้
หลีกเลี่ยงการยกเลิกงาน
โดยทั่วไปคุณควรหลีกเลี่ยงการยกเลิก WorkRequest ที่มีอยู่และจัดคิวใหม่ ข้อแรก เนื่องจากอาจทำให้แอปทำงานบางอย่างซ้ำและอาจทำให้คุณต้อง เพื่อเขียนโค้ดเพิ่มเติมจำนวนมาก
ลองดูตัวอย่างต่อไปนี้เกี่ยวกับกรณีที่การยกเลิก WorkRequest สามารถทำให้เกิด ความยาก:
- คำขอแบ็กเอนด์: หากคุณยกเลิก
Worker
ขณะกำลังประมวลผล เพย์โหลดที่จะส่งไปยังเซิร์ฟเวอร์Worker
ใหม่จะต้องเริ่มต้นใหม่ คำนวณเพย์โหลดที่อาจมีราคาแพงอีกครั้ง - การตั้งเวลา: หากคุณยกเลิก
PeriodicWorkRequest
และคุณจะ เช่นPeriodicWorkRequest
ใหม่เพื่อให้ ดำเนินการตามกำหนดการเดียวกัน คุณต้อง เพื่อคำนวณการชดเชยเวลาเพื่อให้เวลาดำเนินการใหม่สอดคล้องกัน ด้วยคำของานก่อนหน้านี้
updateWork()
API ช่วยให้คุณอัปเดตข้อจำกัดของคำของานและ
พารามิเตอร์อื่นๆ โดยไม่ต้องยุ่งยากกับการยกเลิกและจัดคิวคำขอใหม่
กรณีที่จะยกเลิกงาน
มีบางกรณีที่คุณควรยกเลิก WorkRequest
โดยตรงแทนที่จะยกเลิก
โทรหา updateWork()
นี่คือสิ่งที่คุณควรทำเมื่อต้องการเปลี่ยน
ลักษณะพื้นฐานของงานที่คุณจัดคิวไว้
กรณีที่ควรอัปเดตงาน
ลองนึกภาพแอปรูปภาพที่สำรองข้อมูลรูปภาพของผู้ใช้ทุกวัน มี
เพิ่ม PeriodicWorkRequest
ไว้ในคิว WorkRequest
มีข้อจำกัด
ซึ่งกำหนดให้อุปกรณ์ต้องชาร์จและเชื่อมต่อ Wi-Fi
แต่ผู้ใช้ก็ชาร์จอุปกรณ์เพียง 20 นาทีต่อวันโดยใช้
ที่ชาร์จ ในกรณีนี้ แอปอาจต้องการอัปเดต WorkRequest
เพื่อลดความ
จุดชาร์จ เพื่อให้ยังคงสามารถอัปโหลดรูปภาพได้แม้ว่าอุปกรณ์จะ
ยังชาร์จไม่เต็ม
ในกรณีนี้ คุณใช้เมธอด updateWork()
เพื่ออัปเดตงานได้
ข้อจำกัดของคำขอ
วิธีอัปเดตงาน
เมธอด updateWork()
เป็นวิธีง่ายๆ ในการอัปเดต
WorkRequest
โดยไม่ต้องยกเลิกและจัดคิวใหม่
หากต้องการใช้งานที่อยู่ในคิวของการอัปเดต ให้ทำตามขั้นตอนต่อไปนี้
- รับรหัสที่มีอยู่สำหรับงานที่มีการจัดคิว: รับรหัสของ WorkRequest ที่คุณ
ต้องการอัปเดต คุณสามารถเรียกดูรหัสนี้ด้วย
getWorkInfo
API หรือการยืนยันรหัสด้วยตัวเองตั้งแต่ต้น WorkRequest สำหรับการดึงข้อมูลในภายหลังที่มีทรัพย์สินสาธารณะWorkRequest.id
ก่อนจัดคิว - สร้าง WorkRequest ใหม่: สร้าง
WorkRequest
ใหม่และใช้WorkRequest.Builder.setID()
เพื่อตั้งค่ารหัสให้ตรงกับWorkRequest
- กำหนดข้อจำกัด: ใช้
WorkRequest.Builder.setConstraints()
เพื่อส่งผ่าน ข้อจำกัดใหม่ของ WorkManager - เรียกใช้ updateWork: ส่ง WorkRequest ใหม่ไปยัง
updateWork()
อัปเดตตัวอย่างงาน
ตัวอย่างข้อมูลโค้ดใน Kotlin ที่สาธิตวิธีใช้
updateWork()
วิธีการเปลี่ยนการจำกัดแบตเตอรี่ของ WorkRequest
ที่ใช้
เพื่ออัปโหลดรูปภาพ:
suspend fun updatePhotoUploadWork() {
// Get instance of WorkManager.
val workManager = WorkManager.getInstance(context)
// Retrieve the work request ID. In this example, the work being updated is unique
// work so we can retrieve the ID using the unique work name.
val photoUploadWorkInfoList = workManager.getWorkInfosForUniqueWork(
PHOTO_UPLOAD_WORK_NAME
).await()
val existingWorkRequestId = photoUploadWorkInfoList.firstOrNull()?.id ?: return
// Update the constraints of the WorkRequest to not require a charging device.
val newConstraints = Constraints.Builder()
// Add other constraints as required here.
.setRequiresCharging(false)
.build()
// Create new WorkRequest from existing Worker, new constraints, and the id of the old WorkRequest.
val updatedWorkRequest: WorkRequest =
OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(newConstraints)
.setId(existingWorkRequestId)
.build()
// Pass the new WorkRequest to updateWork().
workManager.updateWork(updatedWorkRequest)
}
จัดการผลลัพธ์
updateWork()
แสดงผล ListenableFuture<UpdateResult>
องค์ประกอบ
UpdateResult
สามารถมีค่าใดค่าหนึ่งจากหลายๆ ค่าที่ระบุหรือไม่
WorkManager นำการเปลี่ยนแปลงของคุณไปใช้ได้ รวมถึงระบุเวลาที่โมเดล
เพื่อใช้การเปลี่ยนแปลง
ดูข้อมูลเพิ่มเติมได้ที่updateWork()
และ UpdateResult
การอ้างอิง
ติดตามงานของคนรุ่นหลัง
ทุกครั้งที่คุณอัปเดต WorkRequest
การสร้างจะเพิ่มขึ้นทีละ 1 รายการ ช่วงเวลานี้
ช่วยให้คุณติดตามได้อย่างชัดเจนว่า WorkRequest
ใดอยู่ในคิวอยู่ในขณะนี้
รุ่นต่างๆ ช่วยให้คุณควบคุมการสังเกต ติดตาม และทดสอบงานได้มากขึ้น
คำขอ
โปรดทำตามขั้นตอนต่อไปนี้เพื่อสร้าง WorkRequest
- WorkInfo: เรียกใช้
WorkManager.getWorkInfoById()
เพื่อเรียกข้อมูลอินสแตนซ์ ของWorkInfo
ที่สอดคล้องกับWorkRequest
ของคุณ- คุณสามารถเรียกเมธอดหลายวิธีที่แสดงผล
WorkInfo
ได้ สำหรับข้อมูลเพิ่มเติม โปรดดูที่ข้อมูลอ้างอิง WorkManager
- คุณสามารถเรียกเมธอดหลายวิธีที่แสดงผล
- getGeneration: เรียกใช้
getGeneration()
ในอินสแตนซ์WorkInfo
Int
ที่แสดงผลสอดคล้องกับการสร้างของWorkRequest
- โปรดทราบว่าจะไม่มีช่องหรือพร็อพเพอร์ตี้การสร้าง แต่จะมีเพียงช่อง
WorkInfo.getGeneration()
วิธี
- โปรดทราบว่าจะไม่มีช่องหรือพร็อพเพอร์ตี้การสร้าง แต่จะมีเพียงช่อง
ตัวอย่างการสร้างแทร็ก
ต่อไปนี้เป็นตัวอย่างการติดตั้งใช้งานเวิร์กโฟลว์ที่อธิบายข้างต้นสำหรับ
เรียกข้อมูลการสร้าง WorkRequest
// Get instance of WorkManager.
val workManager = WorkManager.getInstance(context)
// Retrieve WorkInfo instance.
val workInfo = workManager.getWorkInfoById(oldWorkRequestId)
// Call getGeneration to retrieve the generation.
val generation = workInfo.getGeneration()
นโยบายสำหรับการอัปเดตงาน
ก่อนหน้านี้ วิธีแก้ไขที่แนะนำสำหรับการอัปเดตงานตามรอบเวลาคือการจัดคิว
PeriodicWorkRequest
ตามนโยบาย ExistingPeriodicWorkPolicy.REPLACE
หากมี PeriodicWorkRequest
ที่รอดำเนินการซึ่งมี id
ที่ไม่ซ้ำกันรายการเดียวกัน ฟิลด์
คำขอการทำงานจะยกเลิกและลบออก นโยบายนี้เลิกใช้งานแล้วใน
ของขั้นตอนการทำงานที่ใช้ ExistingPeriodicWorkPolicy.UPDATE
เช่น เมื่อใช้ enqueueUniquePeriodicWork
กับ
PeriodicWorkRequest
คุณสามารถเริ่มต้น PeriodicWorkRequest
ใหม่ด้วย
นโยบาย ExistingPeriodicWorkPolicy.UPDATE
หากมีคำสั่งซื้อที่รอดำเนินการ
PeriodicWorkRequest
ที่มีชื่อไม่ซ้ำเดียวกัน WorkManager จะอัปเดตเป็น
ข้อกำหนดใหม่ หลังจากทำตามเวิร์กโฟลว์นี้แล้ว คุณก็ไม่จำเป็นต้องใช้
updateWork()