สำหรับผู้ใช้ Kotlin นั้น WorkManager จะให้การสนับสนุนโคโริวทีนอย่างเต็มรูปแบบ หากต้องการเริ่มต้นใช้งาน ให้ใส่ work-runtime-ktx
ในไฟล์ gradle คุณควรขยาย CoroutineWorker
ซึ่งมี doWork()
เวอร์ชันที่ระงับแทนการขยาย Worker
เช่น หากต้องการสร้าง 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()
เป็นฟังก์ชันที่หยุดชั่วคราว
ต่างจาก Worker
ตรงที่โค้ดนี้ไม่ทำงานใน Executor
ที่ระบุใน 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
จะจัดการการหยุดทำงานโดยอัตโนมัติด้วยการยกเลิก coroutine และเผยแพร่สัญญาณการยกเลิก คุณไม่จำเป็นต้องดำเนินการใดๆ เป็นพิเศษเพื่อจัดการการหยุดทำงาน
การเรียกใช้ 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>