توفّر WorkManager إمكانية مدمجة لضبط ومراقبة مستوى التقدّم المتوسط للعاملين. إذا كان العامل يعمل أثناء تشغيل التطبيق في المقدّمة، يمكن أيضًا عرض هذه المعلومات للمستخدم باستخدام واجهات برمجة التطبيقات التي تعرض LiveData
الخاص بـ
WorkInfo
.
تتوافق ListenableWorker
الآن مع واجهة برمجة التطبيقات setProgressAsync()
، ما يتيح لها الاحتفاظ بالتقدّم المؤقت. تسمح واجهات برمجة التطبيقات هذه للمطوّرين بضبط مستوى تقدّم وسيط يمكن أن تلاحظه واجهة المستخدم.
يتم تمثيل التقدم بالنوع Data
، وهو حاوية قابلة للتسلسل تحتوي على سمات (مشابهة للنوعين input
وoutput
، وتخضع للقيود نفسها).
لا يمكن الاطّلاع على معلومات التقدم وتعديلها إلا أثناء تشغيل
ListenableWorker
. يتم تجاهل محاولات ضبط مستوى التقدّم في ListenableWorker
بعد اكتمال تنفيذها.
يمكنك أيضًا الاطّلاع على معلومات حول مستوى التقدّم باستخدام إحدى الطريقتَين getWorkInfoBy…()
أو getWorkInfoBy…LiveData()
. تُرجع هذه الطرق مثيلات من
WorkInfo
، التي تتضمّن طريقة
getProgress()
جديدة
تُرجع Data
.
مستوى تقدّم التحديث
بالنسبة إلى مطوّري تطبيقات Java الذين يستخدمون ListenableWorker
أو Worker
، تعرض واجهة برمجة التطبيقات setProgressAsync()
القيمة ListenableFuture<Void>
، وتكون عملية تعديل مستوى التقدّم غير متزامنة، لأنّ عملية التعديل تتضمّن تخزين معلومات مستوى التقدّم في قاعدة بيانات.
في Kotlin، يمكنك استخدام دالة الإضافة CoroutineWorker
object's 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();
}
}
مراقبة مستوى التقدّم
لمراقبة معلومات التقدّم، استخدِم طُرق getWorkInfoById
، واحصل على مرجع إلى WorkInfo
.
في ما يلي مثال يستخدم getWorkInfoByIdFlow
للغة Kotlin وgetWorkInfoByIdLiveData
للغة Java.
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
}
}
});
مراقبة حالة سبب الإيقاف
لتحديد سبب توقّف Worker
، يمكنك تسجيل سبب التوقّف من خلال استدعاء WorkInfo.getStopReason()
:
Kotlin
workManager.getWorkInfoByIdFlow(syncWorker.id)
.collect { workInfo ->
if (workInfo != null) {
val stopReason = workInfo.stopReason
logStopReason(syncWorker.id, stopReason)
}
}
Java
workManager.getWorkInfoByIdLiveData(syncWorker.id)
.observe(getViewLifecycleOwner(), workInfo -> {
if (workInfo != null) {
int stopReason = workInfo.getStopReason();
logStopReason(syncWorker.id, workInfo.getStopReason());
}
});
للمزيد من المستندات حول دورة حياة عناصر Worker
وحالاتها، اطّلِع على حالات العمل.