CoroutineWorker'da mesaj dizisi

Kotlin kullanıcıları için WorkManager, eş yordamları için birinci sınıf destek sağlar. Şunları almak için: work-runtime-ktx gradle dosyanıza ekleyin. Worker süresini uzatmak yerine, askıya alma işlemine sahip olan CoroutineWorker süresini uzatmanız gerekir. doWork() sürümü. Örneğin, basit bir CoroutineWorker oluşturmak istiyorsanız bazı ağ işlemlerini gerçekleştirmek için şunları 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() hesabının askıya alma kapsamında olduğunu unutmayın işlevini kullanın. Worker kodundan farklı olarak bu kod, belirtilen Executor üzerinde çalışmaz Configuration. Bunun yerine varsayılan olarak Dispatchers.Default değerine ayarlanır. Kendi CoroutineContext öğenizi sağlayarak bunu özelleştirebilirsiniz. Yukarıdaki örnekte, bu işlemi Dispatchers.IO üzerinde aşağıdaki şekilde yapmak isteyebilirsiniz:

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 ederek durdurma sayfalarını otomatik olarak işler ve iptal sinyallerinin yayılmasını sağlar. Özel bir işlem yapmanız gerekmez işe son verme etkinliklerini ele almak için.

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

Ayrıca şunu kullanarak bir çalışanı belirli bir işleme bağlayabilirsiniz: RemoteCoroutineWorker ListenableWorker uygulanması.

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

Aşağıdaki örnekte, şuna bağlı bir iş isteği gösterilmektedir: özel işlem:

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 ayrıca AndroidManifest.xml dosyanız:

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

Örnekler