Fortschritt der Zwischen-Worker beobachten

WorkManager bietet erstklassigen Support beim Festlegen und Beobachten von Zwischenfortschritten für Worker. Wenn der Worker ausgeführt wurde, während sich die Anwendung im Vordergrund befand, können diese Informationen dem Nutzer auch über APIs angezeigt werden, die das LiveData von WorkInfo zurückgeben.

ListenableWorker unterstützt jetzt die setProgressAsync() API, wodurch der Zwischenfortschritt beibehalten werden kann. Mit diesen APIs können Entwickler einen Zwischenfortschritt festlegen, der auf der Benutzeroberfläche sichtbar ist. Der Fortschritt wird durch den Typ Data dargestellt. Dabei handelt es sich um einen seriellen Container mit Attributen (ä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 einen ListenableWorker festzulegen, nachdem seine Ausführung abgeschlossen ist, werden ignoriert. Sie können die Fortschrittsinformationen auch mithilfe der Methoden getWorkInfoBy…() oder getWorkInfoBy…LiveData() beobachten. Diese Methoden geben Instanzen von WorkInfo zurück, für die eine neue getProgress()-Methode vorhanden ist, die Data zurückgibt.

Aktualisierungsfortschritt

Für Java-Entwickler, die einen ListenableWorker oder einen Worker verwenden, gibt die setProgressAsync() API einen ListenableFuture<Void> zurück. Der Aktualisierungsfortschritt ist asynchron, da der Aktualisierungsprozess das Speichern von Fortschrittsinformationen in einer Datenbank umfasst. In Kotlin können Sie die Erweiterungsfunktion setProgress() des CoroutineWorker-Objekts verwenden, um Fortschrittsinformationen zu aktualisieren.

Dieses Beispiel zeigt eine einfache ProgressWorker. Worker setzt den Fortschritt beim Start auf 0 und aktualisiert nach Abschluss den Fortschritt 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

Fortschrittsinformationen zu beobachten, ist ebenfalls einfach. Sie können die Methoden getWorkInfoBy…() oder getWorkInfoBy…LiveData() verwenden und einen Verweis auf WorkInfo abrufen.

In diesem Beispiel wird die getWorkInfoByIdLiveData API verwendet.

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
             }
      }
});

Weitere Informationen zum Beobachten von Worker-Objekten finden Sie unter Arbeitsstatus und Arbeit beobachten.