สำหรับผู้ใช้ Kotlin นั้น WorkManager ให้การสนับสนุนชั้นหนึ่งสำหรับโครูทีน โดยวิธีการมีดังนี้
เริ่มต้นแล้ว ให้ใส่ work-runtime-ktx
ในไฟล์ Gradle แทนที่จะขยายเวลา Worker
คุณควรขยายเวลา CoroutineWorker
ซึ่งมีการระงับ
เวอร์ชัน doWork()
เช่น หากคุณต้องการสร้างCoroutineWorker
อย่างง่าย
ในการดำเนินการบางอย่างในเครือข่าย คุณต้องทำดังต่อไปนี้:
class CoroutineDownloadWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
val data = downloadSynchronously("https://www.google.com")
saveData(data)
return Result.success()
}
}
โปรดทราบว่าCoroutineWorker.doWork()
เป็นการระงับ
โค้ดนี้ไม่ทำงานบน Executor
ที่ระบุ ซึ่งต่างจาก Worker
ใน Configuration
ของคุณ ผลลัพธ์
ค่าเริ่มต้นคือ Dispatchers.Default
คุณปรับแต่งค่านี้ได้โดยการระบุCoroutineContext
ของคุณเอง ในตัวอย่างด้านบน คุณอาจต้องดำเนินการนี้ใน Dispatchers.IO
ดังนี้
class CoroutineDownloadWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
withContext(Dispatchers.IO) {
val data = downloadSynchronously("https://www.google.com")
saveData(data)
return Result.success()
}
}
}
CoroutineWorker
จัดการการหยุดหายใจโดยอัตโนมัติด้วยการยกเลิกโครูทีน
และเผยแพร่สัญญาณการยกเลิก คุณไม่จำเป็นต้องทำอะไรพิเศษ
เพื่อจัดการการหยุดงาน
การเรียกใช้ CoroutineWorker ในกระบวนการอื่น
นอกจากนี้คุณยังเชื่อมโยงผู้ปฏิบัติงานกับกระบวนการที่ต้องการได้โดยใช้
RemoteCoroutineWorker
การใช้งาน ListenableWorker
RemoteCoroutineWorker
เชื่อมโยงกับกระบวนการเฉพาะที่มีอาร์กิวเมนต์เกิน 2 รายการ
ที่คุณให้ไว้เป็นส่วนหนึ่งของข้อมูลที่ป้อนเมื่อสร้างคำของาน
ARGUMENT_CLASS_NAME
และ ARGUMENT_PACKAGE_NAME
ตัวอย่างต่อไปนี้แสดงการสร้างคำขอทำงานที่เชื่อมโยงกับ ขั้นตอนที่เฉพาะเจาะจง ได้แก่
Kotlin
val PACKAGE_NAME = "com.example.background.multiprocess" val serviceName = RemoteWorkerService::class.java.name val componentName = ComponentName(PACKAGE_NAME, serviceName) val data: Data = Data.Builder() .putString(ARGUMENT_PACKAGE_NAME, componentName.packageName) .putString(ARGUMENT_CLASS_NAME, componentName.className) .build() return OneTimeWorkRequest.Builder(ExampleRemoteCoroutineWorker::class.java) .setInputData(data) .build()
Java
String PACKAGE_NAME = "com.example.background.multiprocess"; String serviceName = RemoteWorkerService.class.getName(); ComponentName componentName = new ComponentName(PACKAGE_NAME, serviceName); Data data = new Data.Builder() .putString(ARGUMENT_PACKAGE_NAME, componentName.getPackageName()) .putString(ARGUMENT_CLASS_NAME, componentName.getClassName()) .build(); return new OneTimeWorkRequest.Builder(ExampleRemoteCoroutineWorker.class) .setInputData(data) .build();
สำหรับ RemoteWorkerService
แต่ละรายการ คุณยังต้องเพิ่มคำจำกัดความของบริการใน
ไฟล์ AndroidManifest.xml
ของคุณ:
<manifest ... > <service android:name="androidx.work.multiprocess.RemoteWorkerService" android:exported="false" android:process=":worker1" /> <service android:name=".RemoteWorkerService2" android:exported="false" android:process=":worker2" /> ... </manifest>