ملاحظة مستوى تقدّم العمّال المتوسطة

يمتلك WorkManager دعمًا من الدرجة الأولى لإعداد ومتابعة التقدم المتوسط للعاملين. إذا كان العامل يعمل أثناء تشغيل التطبيق في المقدّمة، يمكن أيضًا عرض هذه المعلومات للمستخدم باستخدام واجهات برمجة التطبيقات التي تعرض LiveData من WorkInfo.

تتوافق أداة ListenableWorker الآن مع واجهة برمجة التطبيقات setProgressAsync() التي تتيح لها مواصلة تقدّم مستوى متوسط. تتيح واجهات برمجة التطبيقات هذه للمطوّرين تحديد مستوى تقدّم متوسط يمكن ملاحظته من خلال واجهة المستخدم. وتمثّل مستوى التقدّم بالنوع Data، وهو عبارة عن حاوية قابلة للتسلسل من السمات (على غرار input وoutput، وخاضعة للقيود نفسها).

لا يمكن الاطّلاع على معلومات مستوى التقدُّم وتعديلها إلا أثناء تشغيل "ListenableWorker". ويتم تجاهل محاولات تحديد مستوى التقدّم في ListenableWorker بعد اكتمال تنفيذه. يمكنك أيضًا الاطّلاع على معلومات حول مستوى التقدّم باستخدام إحدى الطريقتَين getWorkInfoBy…() أو getWorkInfoBy…LiveData(). تعرض هاتان الطريقتان مثيلات WorkInfo، التي تحتوي على طريقة getProgress() جديدة تعرض Data.

تعديل مستوى التقدّم

بالنسبة إلى مطوّري برامج Java الذين يستخدمون ListenableWorker أو Worker، تعرض واجهة برمجة التطبيقات setProgressAsync() ListenableFuture<Void>، وهو معدّل تقدّم التحديث غير متزامن، بافتراض أنّ عملية التحديث تتضمّن تخزين معلومات مستوى التقدّم في قاعدة بيانات. في Kotlin، يمكنك استخدام وظيفة الإضافة setProgress() في الكائن CoroutineWorker لتحديث معلومات التقدّم.

يوضّح هذا المثال سمة 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.

في ما يلي مثال على استخدام واجهة برمجة التطبيقات getWorkInfoByIdLiveData API.

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، يُرجى الاطّلاع على حالات العمل ومراقبة العمل.