ב-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
אפשר לקרוא
מצבי עבודה וצפייה בעבודות.