Introduzione a WorkManager

Per iniziare a utilizzare WorkManager, importa prima la libreria nel progetto Android.

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

Alla moda

dependencies {
    def work_version = "2.9.1"

    // (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.1"

    // (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 consiste nel definire un lavoro da eseguire.

Definisci il lavoro

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

Per creare un lavoro da eseguire da WorkManager, estendi la classe Worker e supera il 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() informa il servizio WorkManager se il lavoro è andato a buon fine e, in caso di errore, se deve essere riprovato o meno.

  • Result.success(): il lavoro è stato completato correttamente.
  • Result.failure(): l'operazione non è riuscita.
  • Result.retry(): l'operazione non è riuscita e deve essere riprovata in un altro momento in base alle sue norme di ripetizione.

Creare una richiesta di lavoro

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

Indipendentemente da come scegli di pianificare il lavoro, utilizzerai sempre un WorkRequest. Mentre un Worker definisce l'unità di lavoro, un WorkRequest (e le sue subclassi) definisce 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 momento esatto in cui verrà eseguito il worker dipende dai vincoli utilizzati nel WorkRequest e dalle ottimizzazioni del sistema. WorkManager è progettato per offrire il miglior comportamento in base a queste limitazioni.

Passaggi successivi

Questa guida introduttiva è solo un'introduzione. WorkRequest può anche includere informazioni aggiuntive, ad esempio i vincoli in base ai quali deve essere eseguito il lavoro, l'input al lavoro, un ritardo e il criterio di backoff per ritentare il lavoro. Nella sezione successiva, Definire le richieste di lavoro, scoprirai di più su queste opzioni e su come pianificare attività uniche e ricorrenti.

Risorse aggiuntive

Oltre alla documentazione della guida, sono disponibili diversi blog, codelab e esempi di codice per aiutarti a iniziare.

Campioni

  • Sunflower, un'app di dimostrazione che mostra le best practice con vari componenti dell'architettura, tra cui WorkManager.

Codelab

Blog