Introduzione a WorkManager

Per iniziare a utilizzare WorkManager, devi prima importare la libreria nel tuo progetto Android.

Aggiungi le seguenti dipendenze al file build.gradle dell'app:

Trendy

dependencies {
    def work_version = "2.9.0"

    // (Java only)
    implementation "androidx.work:work-runtime:$work_version"

    // Kotlin + coroutines
    implementation "androidx.work:work-runtime-ktx:$work_version"

    // optional - RxJava2 support
    implementation "androidx.work:work-rxjava2:$work_version"

    // optional - GCMNetworkManager support
    implementation "androidx.work:work-gcm:$work_version"

    // optional - Test helpers
    androidTestImplementation "androidx.work:work-testing:$work_version"

    // optional - Multiprocess support
    implementation "androidx.work:work-multiprocess:$work_version"
}

Kotlin

dependencies {
    val work_version = "2.9.0"

    // (Java only)
    implementation("androidx.work:work-runtime:$work_version")

    // Kotlin + coroutines
    implementation("androidx.work:work-runtime-ktx:$work_version")

    // optional - RxJava2 support
    implementation("androidx.work:work-rxjava2:$work_version")

    // optional - GCMNetworkManager support
    implementation("androidx.work:work-gcm:$work_version")

    // optional - Test helpers
    androidTestImplementation("androidx.work:work-testing:$work_version")

    // optional - Multiprocess support
    implementation "androidx.work:work-multiprocess:$work_version"
}

Dopo aver aggiunto le dipendenze e sincronizzato il progetto Gradle, il passaggio successivo è definire del lavoro da eseguire.

Definisci il lavoro

Il lavoro viene definito utilizzando la classe Worker. Il metodo doWork() viene eseguito in modo asincrono su un thread in background fornito da WorkManager.

Per creare parte del lavoro da eseguire con WorkManager, estendi la classe Worker e esegui l'override del metodo doWork(). Ad esempio, per creare un Worker che carichi immagini, puoi procedere nel seguente modo:

Kotlin


class UploadWorker(appContext: Context, workerParams: WorkerParameters):
       Worker(appContext, workerParams) {
   override fun doWork(): Result {

       // Do the work here--in this case, upload the images.
       uploadImages()

       // Indicate whether the work finished successfully with the Result
       return Result.success()
   }
}

Java


public class UploadWorker extends Worker {
   public UploadWorker(
       @NonNull Context context,
       @NonNull WorkerParameters params) {
       super(context, params);
   }

   @Override
   public Result doWork() {

     // Do the work here--in this case, upload the images.
     uploadImages();

     // Indicate whether the work finished successfully with the Result
     return Result.success();
   }
}

Il valore Result restituito da doWork() indica al servizio WorkManager se il lavoro è riuscito e, in caso di errore, se il lavoro deve essere ripetuto.

  • Result.success(): il lavoro è stato completato correttamente.
  • Result.failure(): operazione non riuscita.
  • Result.retry(): l'operazione non è riuscita e deve essere tentata in un altro momento in base al relativo criterio per i nuovi tentativi.

Crea una richiesta di lavoro

Una volta definito il lavoro, per essere eseguito deve essere pianificato con il servizio WorkManager. WorkManager offre molta flessibilità nella pianificazione del lavoro. Puoi pianificarne l'esecuzione periodicamente in un intervallo di tempo oppure pianificarne l'esecuzione una sola volta.

Indipendentemente da come scegli di pianificare il lavoro, utilizzerai sempre WorkRequest. Mentre un elemento Worker definisce l'unità di lavoro, un elemento WorkRequest (e le sue sottoclassi) definiscono come e quando deve essere eseguita. Nel caso più semplice, puoi utilizzare un OneTimeWorkRequest, come mostrato nell'esempio seguente.

Kotlin


val uploadWorkRequest: WorkRequest =
   OneTimeWorkRequestBuilder<UploadWorker>()
       .build()

Java


WorkRequest uploadWorkRequest =
   new OneTimeWorkRequest.Builder(UploadWorker.class)
       .build();

Invia la richiesta di lavoro al sistema

Infine, devi inviare WorkRequest a WorkManager utilizzando il metodo enqueue().

Kotlin


WorkManager
    .getInstance(myContext)
    .enqueue(uploadWorkRequest)

Java


WorkManager
    .getInstance(myContext)
    .enqueue(uploadWorkRequest);

Il tempo esatto in cui il worker verrà eseguito dipende dai vincoli utilizzati in WorkRequest e dalle ottimizzazioni del sistema. WorkManager è progettato per offrire il miglior comportamento possibile nel rispetto di queste limitazioni.

Passaggi successivi

Questa guida introduttiva graffia solo la superficie. WorkRequest può anche includere informazioni aggiuntive, ad esempio i vincoli in base ai quali l'esecuzione deve essere eseguita, l'input del lavoro, un ritardo e il criterio di backoff per riprovare a lavorare. Nella sezione successiva, Definire le richieste di lavoro, scoprirai di più su queste opzioni in maggiore dettaglio e imparerai a pianificare il lavoro unico e ricorrente.

Risorse aggiuntive

Oltre alla documentazione guida, sono disponibili diversi blog, codelab ed esempi di codice che ti aiuteranno a iniziare.

Samples

  • WorkManagerSample, una semplice app per l'elaborazione delle immagini.
  • Sunflower, un'app demo che mostra le best practice con vari componenti dell'architettura, tra cui WorkManager.

Codelab

Blog