CoroutineWorker'da mesaj dizisi

WorkManager, Kotlin kullanıcıları için coroutine'ler için birinci sınıf destek sağlar. Başlamak için work-runtime-ktx dosyanızı Gradle dosyanıza ekleyin. Worker yerine, doWork()'in askıya alınmış bir sürümüne sahip olan CoroutineWorker'i genişletmeniz gerekir. Örneğin, bazı ağ işlemlerini gerçekleştirmek için basit bir CoroutineWorker oluşturmak isterseniz aşağıdakileri yaparsınız:

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() işlevinin duraklatma işlevi olduğunu unutmayın. Worker'ün aksine bu kod, Configuration dosyanızda belirtilen Executor üzerinde çalışmaz. Bunun yerine varsayılan olarak Dispatchers.Default olur. Kendi CoroutineContext'nizi sağlayarak bunu özelleştirebilirsiniz. Yukarıdaki örnekte, bu işlemi Dispatchers.IO üzerinde aşağıdaki gibi yapmak istersiniz:

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'i iptal ederek ve iptal sinyallerini yayınlayarak duraklamaları otomatik olarak yönetir. İş durdurma ile ilgili herhangi bir işlem yapmanız gerekmez.

CoroutineWorker'ı farklı bir işlemde çalıştırma

Ayrıca, ListenableWorker'ın bir uygulaması olan RemoteCoroutineWorker'i kullanarak bir işçiyi belirli bir sürece bağlayabilirsiniz.

RemoteCoroutineWorker, iş isteğini oluştururken giriş verilerinin bir parçası olarak sağladığınız iki ek bağımsız değişkenle belirli bir işleme bağlanır: ARGUMENT_CLASS_NAME ve ARGUMENT_PACKAGE_NAME.

Aşağıdaki örnekte, belirli bir sürece bağlı bir iş isteği oluşturma işlemi gösterilmektedir:

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();

Her RemoteWorkerService için AndroidManifest.xml dosyanıza bir hizmet tanımı da eklemeniz gerekir:

<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>