การย้ายข้อมูลจาก GCMNetworkManager ไปยัง WorkManager

เอกสารนี้อธิบายวิธีย้ายข้อมูลแอปเพื่อใช้ไลบรารีของไคลเอ็นต์ WorkManager เพื่อดำเนินการเบื้องหลังแทนไลบรารี GCMNetworkManager วิธีที่แอปควรใช้เพื่อตั้งเวลางานในเบื้องหลังคือการใช้ WorkManager โดย โดยรวมไลบรารี WorkManager GCM ไว้ คุณสามารถเปิดใช้งาน WorkManager เพื่อใช้งาน GCM เพื่อกำหนดเวลางานเมื่อทำงานในอุปกรณ์ Android ที่ใช้ API ระดับ 22 หรือต่ำกว่า

ย้ายข้อมูลไปยัง WorkManager

หากปัจจุบันแอปของคุณใช้ GCMNetworkManager เพื่อดำเนินการเบื้องหลัง ทำตามขั้นตอนเหล่านี้เพื่อย้ายข้อมูลไปยัง WorkManager

สำหรับขั้นตอนต่อไปนี้ เราจะถือว่าคุณเริ่มต้นจากสิ่งต่อไปนี้ รหัส GCMNetworkManager ซึ่งกำหนดและกำหนดเวลางานของคุณ

Kotlin

val myTask = OneoffTask.Builder()
    // setService() says what class does the work
    .setService(MyUploadService::class.java)
    // Don't run the task unless device is charging
    .setRequiresCharging(true)
    // Run the task between 5 & 15 minutes from now
    .setExecutionWindow(5 * DateUtil.MINUTE_IN_SECONDS,
            15 * DateUtil.MINUTE_IN_SECONDS)
    // Define a unique tag for the task
    .setTag("test-upload")
    // ...finally, build the task and assign its value to myTask
    .build()
GcmNetworkManager.getInstance(this).schedule(myTask)

Java

// In GcmNetworkManager, this call defines the task and its
// runtime constraints:
OneoffTask myTask = new OneoffTask.Builder()
    // setService() says what class does the work
    .setService(MyUploadService.class)
    // Don't run the task unless device is charging
    .setRequiresCharging(true)
    // Run the task between 5 & 15 minutes from now
    .setExecutionWindow(
        5 * DateUtil.MINUTE_IN_SECONDS,
        15 * DateUtil.MINUTE_IN_SECONDS)
    // Define a unique tag for the task
    .setTag("test-upload")
    // ...finally, build the task and assign its value to myTask
    .build();
GcmNetworkManager.getInstance(this).schedule(myTask);

ในตัวอย่างนี้ เราสมมติว่า MyUploadService เป็นผู้กำหนดการดำเนินการอัปโหลดจริง

Kotlin

class MyUploadService : GcmTaskService() {
    fun onRunTask(params: TaskParams): Int {
        // Do some upload work
        return GcmNetworkManager.RESULT_SUCCESS
    }
}

Java

class MyUploadService extends GcmTaskService {
    @Override
    public int onRunTask(TaskParams params) {
        // Do some upload work
        return GcmNetworkManager.RESULT_SUCCESS;
    }
}

รวมไลบรารี WorkManager

หากต้องการใช้ชั้นเรียน WorkManager คุณจะต้องเพิ่มไลบรารี WorkManager ลงใน ทรัพยากร Dependency ของบิลด์ นอกจากนี้ คุณยังต้องเพิ่มไลบรารี WorkManager GCM ซึ่ง เปิดใช้ WorkManager ใช้ GCM สำหรับการจัดตารางเวลางานเมื่อแอปของคุณกำลังทำงาน อุปกรณ์ที่ไม่รองรับ JobScheduler (กล่าวคือ อุปกรณ์ที่ใช้ API ระดับ 22 หรือต่ำกว่า) สำหรับรายละเอียดทั้งหมดเกี่ยวกับการเพิ่มไลบรารี โปรดดูที่การเริ่มต้นใช้งาน WorkManager

แก้ไขไฟล์ Manifest

เมื่อคุณใช้งาน GCMNetworkManager คุณได้เพิ่มอินสแตนซ์ GcmTaskService ไปยังไฟล์ Manifest ของแอปตามที่อธิบายไว้ใน GcmNetworkManager เอกสารอ้างอิง GcmTaskService จะดูงานที่เข้ามาและมอบหมายงานให้กับงาน เครื่องจัดการ WorkManager จะจัดการการมอบสิทธิ์งานให้กับ Worker ของคุณ คุณจึงไม่ต้องสิ้นเปลืองอีกต่อไป ต้องการชั้นเรียนที่ทำได้ เพียงนำ GcmTaskService ของคุณออกจาก ไฟล์ Manifest

กำหนดผู้ปฏิบัติงาน

การใช้งาน GCMNetworkManager ของคุณจะกำหนด OneoffTask หรือ RecurringTask ซึ่งระบุสิ่งที่ต้องทำให้เสร็จ คุณจะต้องเขียนใหม่เป็น Worker ตามที่บันทึกไว้ในการกำหนดผลงาน

ตัวอย่าง GCMNetworkManager โค้ด กำหนดงาน myTask การทำงานที่เทียบเท่าของ WorkManager มีลักษณะดังนี้

Kotlin

class UploadWorker(context: Context, params: WorkerParameters)
                        : Worker(context, params) {
    override fun doWork() : Result {
        // Do the upload operation ...
        myUploadOperation()

        // Indicate whether the task finished successfully with the Result
        return Result.success()
    }
}

Java

public class UploadWorker extends Worker {

    public UploadWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
        super(context, params);
    }

    @Override
    public Result doWork() {
      // Do the upload operation ...

      myUploadOperation()

      // Indicate whether the task finished successfully with the Result
      return Result.success()
    }
}

งาน GCM และ Worker มีความแตกต่างกันเล็กน้อย:

  • GCM ใช้ออบเจ็กต์ TaskParams เพื่อส่งพารามิเตอร์ไปยังงาน WorkManager ใช้ข้อมูลอินพุตซึ่งคุณระบุใน WorkRequest ได้เป็น ตามที่อธิบายไว้ในเอกสาร WorkManager สำหรับการกำหนดอินพุต/เอาต์พุตสำหรับ งานของคุณ ในทั้งสองกรณี คุณสามารถส่งคู่คีย์/ค่าที่ระบุพารามิเตอร์ที่คงสถานะได้ พารามิเตอร์ที่งานนี้ต้องการ
  • GcmTaskService ส่งสัญญาณว่าสำเร็จหรือล้มเหลวโดยแสดงแฟล็ก เช่น GcmNetworkManager.RESULT_SUCCESS WorkManager Worker ส่งสัญญาณผลลัพธ์ โดยใช้ ListenableWorker.Result เช่น ListenableWorker.Result.success(), และแสดงผลค่าของวิธีดังกล่าว
  • ตามที่เราได้กล่าวไว้ คุณไม่ได้กำหนดข้อจำกัดหรือแท็กเมื่อคุณกำหนด Worker; แต่คุณจะทำเช่นนี้ในขั้นตอนถัดไปเมื่อคุณสร้าง WorkRequest

กำหนดเวลาคำของาน

การกำหนด Worker จะระบุสิ่งที่คุณต้องทำ ใช้ระบุเวลาที่งาน คุณต้องกำหนด WorkRequest:

  1. สร้าง OneTimeWorkRequest หรือ PeriodicWorkRequest และ ตั้งค่าข้อจำกัดที่ต้องการ ซึ่งระบุเวลาที่งานควรทำงาน รวมถึง แท็กใดก็ได้เพื่อระบุผลงานของคุณ
  2. ส่งต่อคำขอไปยัง WorkManager.enqueue() เพื่อจัดคิวงานสำหรับการดำเนินการ

ตัวอย่างเช่น ส่วนก่อนหน้านี้แสดงวิธีการแปลง OneoffTask เป็น Worker ที่เทียบเท่า อย่างไรก็ตาม Worker นั้นไม่มี ข้อจำกัดและแท็กการดำเนินการของออบเจ็กต์ OneoffTask แต่เราตั้งค่า ข้อจำกัดและรหัสงานเมื่อเราสร้าง WorkRequest นอกจากนี้เรายังระบุ ว่างานจะต้องไม่ทํางาน เว้นแต่จะมีการเชื่อมต่อเครือข่าย คุณไม่จำเป็นต้องใช้ เพื่อขอการเชื่อมต่อเครือข่ายกับ GCMNetworkManager อย่างชัดเจน เนื่องจาก GCMNetworkManager กำหนดให้ต้องมีการเชื่อมต่อเครือข่ายโดยค่าเริ่มต้น แต่ WorkManager ต้องมี ไม่จำเป็นต้องใช้การเชื่อมต่อเครือข่าย เว้นแต่ว่าคุณจะเพิ่มข้อจำกัดนั้นไว้โดยเฉพาะ เมื่อกำหนด WorkRequest แล้ว เราจะจัดคิวด้วย WorkManager

Kotlin

val uploadConstraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true).build()

val uploadTask = OneTimeWorkRequestBuilder<UploadWorker>()
    .setConstraints(uploadConstraints)
    .build()
WorkManager.getInstance().enqueue(uploadTask)

Java

Constraints uploadConstraints = new Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true)
    .build();

OneTimeWorkRequest uploadTask =
        new OneTimeWorkRequest.Builder(UploadWorker.class)
  .setConstraints(uploadConstraints)
  .build();
WorkManager.getInstance().enqueue(uploadTask);

การแมป API

ส่วนนี้อธิบายถึงฟีเจอร์ GCMNetworkManager บางรายการและการแมปข้อจำกัด ไปยัง WorkManager ที่เทียบเท่ากัน

จำกัดการแมป

GCMNetworkManager ให้คุณตั้งค่าข้อจำกัดมากมายเกี่ยวกับเวลาที่งานควร วิ่งได้ ในกรณีส่วนใหญ่จะมีข้อจำกัด WorkManager ที่เทียบเท่ากันอย่างชัดเจน ช่วงเวลานี้ จะแสดงรายการสิ่งที่เทียบเท่ากัน

กำหนดข้อจำกัดเกี่ยวกับงาน GCMNetworkManager โดยเรียกใช้เมธอดที่เหมาะสมใน ออบเจ็กต์เครื่องมือสร้างของงาน ตัวอย่างเช่น คุณสามารถตั้งค่าข้อกำหนดเครือข่ายโดย กำลังโทรหา Task.Builder.setRequiredNetwork()

ใน WorkManager คุณจะสร้าง Constraints.Builder ของออบเจ็กต์และ เรียกเมธอดของออบเจ็กต์ดังกล่าวเพื่อกำหนดข้อจำกัด (ตัวอย่างเช่น Constraints.Builder.setRequiredNetworkType()), จากนั้นใช้ Builder เพื่อสร้างออบเจ็กต์ข้อจำกัดที่คุณสามารถติดไว้กับ คำขอทำงาน สำหรับข้อมูลเพิ่มเติม โปรดดูการกำหนดผลงาน คำขอ

ข้อจำกัด GCMNetworkManager WorkManager ที่เทียบเท่า หมายเหตุ
setPersisted() (ไม่บังคับ) งาน WorkManager ทั้งหมดจะยังคงอยู่ในการรีบูตอุปกรณ์
setRequiredNetwork() setRequiredNetworkType() โดยค่าเริ่มต้น GCMNetworkManager ต้องมีสิทธิ์เข้าถึงเครือข่าย WorkManager ไม่ต้องการการเข้าถึงเครือข่ายโดยค่าเริ่มต้น หากงานจำเป็นต้องเข้าถึงเครือข่าย คุณต้องใช้ setRequiredNetworkType(CONNECTED) หรือตั้งค่าประเภทเครือข่ายที่เจาะจงมากขึ้น
setRequiresCharging()

การแมปอื่นๆ

นอกจากข้อจำกัดแล้ว ยังมีการตั้งค่าอื่นๆ อีกที่คุณสามารถนำไปใช้กับ GCMNetworkManager งาน ส่วนนี้แสดงวิธีที่เกี่ยวข้องในการนำการตั้งค่าเหล่านั้นไปใช้กับ งาน WorkManager

แท็ก

งาน GCMNetworkManager ทั้งหมดต้องมีสตริงแท็ก ซึ่งคุณตั้งค่าด้วยการเรียกใช้ setTag() ของช่างก่อสร้าง งาน WorkManager จะได้รับการระบุโดยไม่ซ้ำกันด้วยรหัส ซึ่งก็คือ WorkManager สร้างโดยอัตโนมัติ คุณสามารถรับรหัสดังกล่าวโดยการโทร WorkRequest.getId() ใน นอกจากนี้ คำของานอาจมีแท็กอย่างน้อย 1 แท็กหากต้องการ วิธีตั้งค่าแท็กสำหรับ งาน WorkManager ให้เรียก WorkRequest.Builder.addTag() ก่อนที่คุณจะใช้ Builder ดังกล่าวเพื่อสร้าง WorkRequest

ใน GCMNetworkManager คุณสามารถเรียกใช้ setUpdateCurrent() เพื่อระบุว่างานนั้นควรแทนที่งานที่มีอยู่ด้วยแท็กเดียวกันหรือไม่ วิธีที่เทียบเท่าของ WorkManager คือการจัดคิวงานโดยการเรียกใช้ enqueueUniqueWork() หรือ enqueueUniquePeriodicWork() หากคุณใช้วิธีการเหล่านี้ คุณจะต้องตั้งชื่องานที่ไม่ซ้ำกันและระบุวิธี WorkManager ควรจัดการคำขอหากมีงานที่รอดำเนินการอยู่ในขณะนั้น ชื่อ สำหรับข้อมูลเพิ่มเติม โปรดดูการจัดการที่ไม่ซ้ำ งาน

พารามิเตอร์งาน

คุณสามารถส่งพารามิเตอร์ไปยังงาน GCMNetworkManager ได้โดยการเรียกใช้ Task.Builder.setExtras() และส่ง Bundle ที่มีพารามิเตอร์เหล่านั้น WorkManager ช่วยให้คุณผ่าน ออบเจ็กต์ Data ไปยังงาน WorkManager ที่มีพารามิเตอร์เป็นคีย์/ค่า คู่ โปรดดูรายละเอียดที่หัวข้อ กำหนดข้อมูลอินพุต