Bagi pengguna Kotlin, WorkManager memberikan dukungan kelas satu untuk coroutine. Untuk memulai,
sertakan work-runtime-ktx
pada file gradle Anda. Sebagai ganti memperpanjang Worker
, Anda harus memperpanjang CoroutineWorker
, yang memiliki versi penangguhan doWork()
. Misalnya, jika Anda ingin membuat CoroutineWorker
sederhana
untuk melakukan beberapa operasi jaringan, Anda dapat melakukan langkah berikut:
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()
}
}
Perhatikan bahwa CoroutineWorker.doWork()
adalah fungsi
penangguhan. Tidak seperti Worker
, kode ini tidak berjalan pada Executor
yang ditentukan
dalam Configuration
Anda. Sebagai gantinya,
kode ini akan didefaultkan ke Dispatchers.Default
. Anda dapat menyesuaikannya dengan menyediakan CoroutineContext
Anda sendiri. Dalam contoh di atas, Anda dapat melakukan pekerjaan ini di Dispatchers.IO
, seperti berikut:
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
otomatis menangani penghentian dengan membatalkan coroutine
dan menyebarkan sinyal pembatalan. Anda tidak perlu melakukan hal khusus
untuk menangani penghentian pekerjaan.
Menjalankan CoroutineWorker dalam proses yang berbeda
Anda juga dapat mengikat pekerja ke proses tertentu menggunakan
RemoteCoroutineWorker
,
implementasi ListenableWorker
.
RemoteCoroutineWorker
terikat ke proses tertentu dengan dua argumen tambahan
yang Anda berikan sebagai bagian dari data input saat membuat permintaan pekerjaan:
ARGUMENT_CLASS_NAME
dan ARGUMENT_PACKAGE_NAME
.
Contoh berikut menunjukkan pembuatan permintaan pekerjaan yang terikat dengan proses tertentu:
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();
Untuk setiap RemoteWorkerService
, Anda juga perlu menambahkan definisi layanan di
file AndroidManifest.xml
:
<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>