CoroutineWorker'da mesaj dizisi

Kotlin kullanıcıları için WorkManager, eşleşenler için birinci sınıf destek sağlar. Başlamak için gradle dosyanıza work-runtime-ktx ifadesini ekleyin. Worker hizmetinin süresini uzatmak yerine, askıya alma sürümü doWork() olan CoroutineWorker hizmetinin süresini uzatmanız 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()'in bir askıya alma işlevi olduğunu unutmayın. Worker kodunun aksine bu kod, Configuration etiketinizde belirtilen Executor üzerinde çalışmaz. Bunun yerine, varsayılan olarak Dispatchers.Default değerine ayarlanır. Kendi CoroutineContext bilgilerinizi sağlayarak bunu özelleştirebilirsiniz. Yukarıdaki örnekte, bu çalışmayı muhtemelen Dispatchers.IO üzerinde aşağıdaki şekilde 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, eş yordamı iptal edip iptal sinyallerini yayarak durdurma işlemlerini otomatik olarak işler. İşe ara verme işlemlerini gerçekleştirmek için özel bir şey yapmanız gerekmez.

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

Ayrıca, bir ListenableWorker uygulaması olan RemoteCoroutineWorker kullanarak bir çalışanı belirli bir sürece bağlayabilirsiniz.

RemoteCoroutineWorker, iş isteğini oluştururken giriş verileri kapsamında sağladığınız ek iki bağımsız değişkenle belirli bir sürece bağlanır: ARGUMENT_CLASS_NAME ve ARGUMENT_PACKAGE_NAME.

Aşağıdaki örnek, belirli bir sürece bağlı bir iş isteğinin oluşturulmasını göstermektedir:

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>

Sana Özel