Osserva i progressi intermedi dei lavoratori

WorkManager offre un supporto di alto livello per l'impostazione e l'osservazione della progressi per i lavoratori. Se il worker era in esecuzione mentre l'app era nell' in primo piano, queste informazioni possono essere mostrate all'utente anche utilizzando le API, restituisce LiveData di WorkInfo.

ListenableWorker ora supporta setProgressAsync() che le consente di mantenere i progressi intermedi. Queste API consentono agli sviluppatori di impostare i progressi intermedi osservabili dall'interfaccia utente. L'avanzamento è rappresentato dal tipo Data, un container serializzabile di proprietà (simile a input e output, e soggetti alle stesse restrizioni).

Le informazioni sull'avanzamento possono essere osservate e aggiornate solo mentre ListenableWorker è in esecuzione. Tenta di impostare i progressi su un ListenableWorker al termine dell'esecuzione vengono ignorati. Puoi anche osservare i progressi di informazioni utilizzando l'elemento getWorkInfoBy…() o getWorkInfoBy…LiveData() di machine learning. Questi metodi restituiscono istanze di WorkInfo, che ha una nuova Metodo getProgress() che restituisce Data.

Avanzamento dell'aggiornamento

Per gli sviluppatori Java che utilizzano una ListenableWorker o Worker, setProgressAsync() L'API restituisce un ListenableFuture<Void>; l'avanzamento dell'aggiornamento è asincrono, dato che il processo di aggiornamento prevede l'archiviazione delle informazioni sull'avanzamento in un database. In Kotlin, puoi utilizzare la CoroutineWorker setProgress() dell'oggetto funzione di estensione per aggiornare le informazioni sull'avanzamento.

Questo esempio mostra un semplice ProgressWorker. L'Worker imposta l'avanzamento su 0 all'inizio e al termine aggiorna il valore dell'avanzamento impostandolo su 100.

Kotlin

import android.content.Context
import androidx.work.CoroutineWorker
import androidx.work.Data
import androidx.work.WorkerParameters
import kotlinx.coroutines.delay

class ProgressWorker(context: Context, parameters: WorkerParameters) :
    CoroutineWorker(context, parameters) {

    companion object {
        const val Progress = "Progress"
        private const val delayDuration = 1L
    }

    override suspend fun doWork(): Result {
        val firstUpdate = workDataOf(Progress to 0)
        val lastUpdate = workDataOf(Progress to 100)
        setProgress(firstUpdate)
        delay(delayDuration)
        setProgress(lastUpdate)
        return Result.success()
    }
}

Java

import android.content.Context;
import androidx.annotation.NonNull;
import androidx.work.Data;
import androidx.work.Worker;
import androidx.work.WorkerParameters;

public class ProgressWorker extends Worker {

    private static final String PROGRESS = "PROGRESS";
    private static final long DELAY = 1000L;

    public ProgressWorker(
        @NonNull Context context,
        @NonNull WorkerParameters parameters) {
        super(context, parameters);
        // Set initial progress to 0
        setProgressAsync(new Data.Builder().putInt(PROGRESS, 0).build());
    }

    @NonNull
    @Override
    public Result doWork() {
        try {
            // Doing work.
            Thread.sleep(DELAY);
        } catch (InterruptedException exception) {
            // ... handle exception
        }
        // Set progress to 100 after you are done doing your work.
        setProgressAsync(new Data.Builder().putInt(PROGRESS, 100).build());
        return Result.success();
    }
}

Osservazione dei progressi

Anche osservare le informazioni sui progressi è semplice. Puoi utilizzare lo getWorkInfoBy…() oppure getWorkInfoBy…LiveData() e ottenere un riferimento a WorkInfo.

Ecco un esempio che utilizza l'API getWorkInfoByIdLiveData.

Kotlin

WorkManager.getInstance(applicationContext)
    // requestId is the WorkRequest id
    .getWorkInfoByIdLiveData(requestId)
    .observe(observer, Observer { workInfo: WorkInfo? ->
            if (workInfo != null) {
                val progress = workInfo.progress
                val value = progress.getInt(Progress, 0)
                // Do something with progress information
            }
    })

Java

WorkManager.getInstance(getApplicationContext())
     // requestId is the WorkRequest id
     .getWorkInfoByIdLiveData(requestId)
     .observe(lifecycleOwner, new Observer<WorkInfo>() {
             @Override
             public void onChanged(@Nullable WorkInfo workInfo) {
                 if (workInfo != null) {
                     Data progress = workInfo.getProgress();
                     int value = progress.getInt(PROGRESS, 0)
                     // Do something with progress
             }
      }
});

Per ulteriore documentazione sull'osservazione di Worker oggetti, leggi Stati lavorativi e osservazione del lavoro.