เมื่อคุณใช้ 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