การจัดชุดข้อความใน CoroutineWorker

สำหรับผู้ใช้ 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>