อัปเดตงานที่อยู่ในคิวแล้ว

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 โดยไม่ต้องยกเลิกและจัดคิวใหม่

หากต้องการใช้งานที่อยู่ในคิวของการอัปเดต ให้ทำตามขั้นตอนต่อไปนี้

  1. รับรหัสที่มีอยู่สำหรับงานที่มีการจัดคิว: รับรหัสของ WorkRequest ที่คุณ ต้องการอัปเดต คุณสามารถเรียกดูรหัสนี้ด้วย getWorkInfo API หรือการยืนยันรหัสด้วยตัวเองตั้งแต่ต้น WorkRequest สำหรับการดึงข้อมูลในภายหลังที่มีทรัพย์สินสาธารณะ WorkRequest.id ก่อนจัดคิว
  2. สร้าง WorkRequest ใหม่: สร้าง WorkRequest ใหม่และใช้ WorkRequest.Builder.setID() เพื่อตั้งค่ารหัสให้ตรงกับ WorkRequest
  3. กำหนดข้อจำกัด: ใช้ WorkRequest.Builder.setConstraints() เพื่อส่งผ่าน ข้อจำกัดใหม่ของ WorkManager
  4. เรียกใช้ 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

  1. WorkInfo: เรียกใช้ WorkManager.getWorkInfoById() เพื่อเรียกข้อมูลอินสแตนซ์ ของ WorkInfo ที่สอดคล้องกับ WorkRequest ของคุณ
    • คุณสามารถเรียกเมธอดหลายวิธีที่แสดงผล WorkInfo ได้ สำหรับข้อมูลเพิ่มเติม โปรดดูที่ข้อมูลอ้างอิง WorkManager
  2. 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()