Fortschritt der Zwischen-Worker beobachten

WorkManager bietet erstklassigen Support für die Einrichtung und Beobachtung von für die Arbeiter:innen. Wenn der Worker ausgeführt wurde, während sich die Anwendung im können diese Informationen dem Nutzer auch über APIs angezeigt werden, die LiveData von WorkInfo

ListenableWorker unterstützt jetzt die setProgressAsync() API, mit der der Zwischenfortschritt beibehalten werden kann. Diese APIs ermöglichen Entwickelnden einen Zwischenfortschritt festzulegen, der auf der Benutzeroberfläche beobachtet werden kann. Der Fortschritt wird durch den Typ Data dargestellt. ein serialisierbarer Container mit Eigenschaften (ähnlich input und output und unterliegen denselben Einschränkungen).

Fortschrittsinformationen können nur während der ListenableWorker wird ausgeführt. Versuche, den Fortschritt für einen ListenableWorker festzulegen ausgeführt werden, ignoriert. Sie können auch den Fortschritt getWorkInfoBy…() oder getWorkInfoBy…LiveData() . Diese Methoden geben Instanzen von WorkInfo mit einer neuen Methode getProgress() das Data zurückgibt.

Aktualisierungsfortschritt

Für Java-Entwickler, die ein ListenableWorker verwenden oder ein Worker-Element, das setProgressAsync() Die API gibt Folgendes zurück: ListenableFuture<Void>; Aktualisierung des Fortschritts asynchron ist, Dabei werden Fortschrittsinformationen in einer Datenbank gespeichert. In Kotlin können Sie den CoroutineWorker verwenden. setProgress() des Objekts Erweiterungsfunktion, um Fortschrittsinformationen zu aktualisieren.

Dieses Beispiel zeigt eine einfache ProgressWorker. Der Fortschritt von Worker wird festgelegt auf „0“ zu Beginn. Nach Abschluss wird der Fortschrittswert auf 100 aktualisiert.

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

Auch die Beobachtung von Fortschrittsinformationen ist ganz einfach. Sie können die getWorkInfoBy…() oder getWorkInfoBy…LiveData() Methoden und rufen Sie einen Verweis auf WorkInfo ab.

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 zur Beobachtung von Worker-Objekten finden Sie unter Arbeitsstatus und Beobachtung der Arbeit.