CoroutineWorker 中的執行緒

如果是 Kotlin 使用者,WorkManager 針對 Coroutines 提供一流的支援。如要開始,請在 Gradle 檔案中加入 work-runtime-ktx。請勿擴充 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() 是「停權」函式,與 Worker 不同,但這些程式碼「不會」在指定的 Configuration 中的 Executor 上執行。預設值為 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

您也可以導入 ListenableWorker 以使用 RemoteCoroutineWorker,將工作站繫結至特定程序。

RemoteCoroutineWorker 會繫結至特定程序,其中包含兩個額外的引數,並在建立作業要求時做為輸入資料的一部分:ARGUMENT_CLASS_NAMEARGUMENT_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>

範例