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>