Fortschritt der Zwischen-Worker beobachten

WorkManager bietet integrierte Unterstützung für das Festlegen und Beobachten des Zwischenfortschritts für Worker. Wenn der Worker ausgeführt wurde, während sich die App im Vordergrund befand, können diese Informationen dem Nutzer auch über APIs angezeigt werden, die den LiveData von WorkInfo zurückgeben.

ListenableWorker unterstützt jetzt die setProgressAsync() API, mit der der Zwischenfortschritt beibehalten werden kann. Mit diesen APIs können Entwickler Zwischenfortschritte festlegen, die in der Benutzeroberfläche angezeigt werden können. Der Fortschritt wird durch den Typ Data dargestellt, der ein serialisierbarer Container von Eigenschaften ist (ähnlich wie input und output und unterliegt denselben Einschränkungen).

Fortschrittsinformationen können nur beobachtet und aktualisiert werden, während ListenableWorker ausgeführt wird. Versuche, den Fortschritt für ein ListenableWorker festzulegen, nachdem die Ausführung abgeschlossen ist, werden ignoriert.

Sie können auch Fortschrittsinformationen mit einer der Methoden getWorkInfoBy…() oder getWorkInfoBy…LiveData() abrufen. Diese Methoden geben Instanzen von WorkInfo zurück, die eine neue getProgress()-Methode haben, die Data zurückgibt.

Aktualisierungsfortschritt

Für Java-Entwickler, die ListenableWorker oder Worker verwenden, gibt die setProgressAsync() API ListenableFuture<Void> zurück. Die Aktualisierung des Fortschritts erfolgt asynchron, da beim Aktualisierungsprozess Fortschrittsinformationen in einer Datenbank gespeichert werden. In Kotlin können Sie die Erweiterungsfunktion setProgress() des Objekts CoroutineWorker verwenden, um Fortschrittsinformationen zu aktualisieren.

In diesem Beispiel wird eine ProgressWorker gezeigt. Der Worker setzt seinen Fortschritt beim Start auf 0 und aktualisiert den Fortschrittswert nach Abschluss auf 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();
    }
}

Fortschritt beobachten

Verwenden Sie die Methoden getWorkInfoById, um Fortschrittsinformationen zu erhalten, und rufen Sie eine Referenz zu WorkInfo ab.

Hier ist ein Beispiel, in dem getWorkInfoByIdFlow für Kotlin und getWorkInfoByIdLiveData für Java verwendet wird.

Kotlin

WorkManager.getInstance(applicationContext)
      // requestId is the WorkRequest id
      .getWorkInfoByIdFlow(requestId)
      .collect { 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
             }
      }
});

Weitere Informationen zum Beobachten von Worker-Objekten finden Sie unter Arbeitsstatus und Beobachten von Arbeit. Informationen zum Abrufen von stopReason, wenn die Arbeit unerwartet beendet wird, finden Sie unter Status des Beendigungsgrunds beobachten.