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>