בדיקת ההתקדמות של עובדים ברמת הביניים

ב-WorkManager יש תמיכה ברמה הגבוהה ביותר להגדרה ולתצפית של ביניים ההתקדמות של העובדים. אם העובד פעל בזמן שהאפליקציה הייתה בחזית, מידע זה יכול גם להציג למשתמש באמצעות ממשקי API החזרת LiveData של WorkInfo

עכשיו יש תמיכה ב-ListenableWorker setProgressAsync() API, שמאפשר לו לשמור על התקדמות הביניים. ממשקי ה-API האלה מאפשרים למפתחים להגדיר התקדמות ביניים שניתנת לצפייה בממשק המשתמש. ההתקדמות מיוצגת על ידי הסוג Data, שהוא מאגר מאפיינים שניתן למספר טורי (בדומה ל-input output, ובכפוף לאותן הגבלות).

ניתן לצפות בפרטי ההתקדמות ולעדכן אותם רק בזמן הרשימה ListenableWorker פועלת. ניסיונות להגדיר התקדמות במכשיר ListenableWorker לאחר סיום ההפעלה, המערכת מתעלמת ממנו. אפשר גם לראות את ההתקדמות באמצעות getWorkInfoBy…() או getWorkInfoBy…LiveData() שיטות. השיטות האלה מחזירות מופעים של WorkInfo, עם אמצעי תשלום getProgress() שמחזירה את הערך Data.

עדכון ההתקדמות

למפתחי Java שמשתמשים ב-ListenableWorker או Worker, setProgressAsync() API מחזיר ListenableFuture<Void>; עדכון ההתקדמות אסינכרוני, בהינתן שתהליך העדכון כולל אחסון של פרטי ההתקדמות במסד נתונים. ב-Kotlin אפשר להשתמש ב-CoroutineWorker setProgress() של האובייקט כדי לעדכן את פרטי ההתקדמות.

בדוגמה הזו מוצג ProgressWorker פשוט. ההתקדמות של Worker מגדירה את ההתקדמות 0 כשהיא מתחילה, ובסיום הפעולה מעדכנת את ערך ההתקדמות ל-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();
    }
}

צפייה בהתקדמות

גם הצפייה במידע על ההתקדמות היא פשוטה. אפשר להשתמש getWorkInfoBy…() או getWorkInfoBy…LiveData() וגם הפניה אל WorkInfo.

לפניכם דוגמה שמשתמשת ב-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
             }
      }
});

לתיעוד נוסף על צפייה באובייקטים ב-Worker אפשר לקרוא מצבי עבודה וצפייה בעבודות.