การจัดการชุดข้อความในผู้ปฏิบัติงาน

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

เมื่อกำหนดค่า WorkManager ด้วยตนเอง คุณจะระบุ Executor เป็น ดังต่อไปนี้:

Kotlin

WorkManager.initialize(
    context,
    Configuration.Builder()
         // Uses a fixed thread pool of size 8 threads.
        .setExecutor(Executors.newFixedThreadPool(8))
        .build())

Java

WorkManager.initialize(
    context,
    new Configuration.Builder()
        .setExecutor(Executors.newFixedThreadPool(8))
        .build());

ต่อไปนี้คือตัวอย่างของ Worker แบบง่ายที่ดาวน์โหลดเนื้อหาของหน้าเว็บ 100 ครั้ง:

Kotlin

class DownloadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {

    override fun doWork(): ListenableWorker.Result {
        repeat(100) {
            try {
                downloadSynchronously("https://www.google.com")
            } catch (e: IOException) {
                return ListenableWorker.Result.failure()
            }
        }

        return ListenableWorker.Result.success()
    }
}

Java

public class DownloadWorker extends Worker {

    public DownloadWorker(Context context, WorkerParameters params) {
        super(context, params);
    }

    @NonNull
    @Override
    public Result doWork() {
        for (int i = 0; i < 100; i++) {
            try {
                downloadSynchronously("https://www.google.com");
            } catch (IOException e) {
                return Result.failure();
            }
        }

        return Result.success();
    }

}

โปรดทราบว่า Worker.doWork() เป็น การเรียกพร้อมกัน - คุณต้องทำงานในเบื้องหลังทั้งหมด บล็อกแฟชั่น แล้วทำให้เสร็จเมื่อถึงเวลาที่เมธอดออก ถ้าคุณเรียก API แบบอะซิงโครนัสใน doWork() และแสดงผล Result การเรียกกลับของคุณอาจไม่ ทำงานอย่างถูกต้อง หากพบว่าคุณตกอยู่ในสถานการณ์นี้ ให้ลองใช้ ListenableWorker (ดูการจัดชุดข้อความใน ListenableWorker)

เมื่อ Worker ที่ทำงานอยู่หยุดทำงานไม่ว่าด้วยเหตุผลใดก็ตาม รับสายไปที่ Worker.onStopped() ลบล้างเมธอดนี้หรือ โทรหา Worker.isStopped() เพื่อตรวจหาโค้ดและเพิ่มพื้นที่ว่าง ในกรณีที่จำเป็น เมื่อWorker ในตัวอย่างข้างต้นหยุดแล้ว ซึ่งอาจจะอยู่ตรงกลางของลูป การดาวน์โหลดรายการและยังคงดาวน์โหลดต่อไปแม้จะหยุดให้บริการแล้ว ถึง เพิ่มประสิทธิภาพพฤติกรรมนี้ คุณสามารถทำดังต่อไปนี้

Kotlin

class DownloadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {

    override fun doWork(): ListenableWorker.Result {
        repeat(100) {
            if (isStopped) {
                break
            }

            try {
                downloadSynchronously("https://www.google.com")
            } catch (e: IOException) {
                return ListenableWorker.Result.failure()
            }

        }

        return ListenableWorker.Result.success()
    }
}

Java

public class DownloadWorker extends Worker {

    public DownloadWorker(Context context, WorkerParameters params) {
        super(context, params);
    }

    @NonNull
    @Override
    public Result doWork() {
        for (int i = 0; i < 100; ++i) {
            if (isStopped()) {
                break;
            }

            try {
                downloadSynchronously("https://www.google.com");
            } catch (IOException e) {
                return Result.failure();
            }
        }

        return Result.success();
    }
}

เมื่อหยุด Worker แล้ว ไม่ว่าคุณจะคืนสินค้าจากอะไร Worker.doWork(); ระบบจะไม่สนใจ Result