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>