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

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

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

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

مدى التقدُّم في عملية التحديث

لمطوّري برامج Java الذين يستخدمون ListenableWorker أو Worker، setProgressAsync() تعرض واجهة برمجة التطبيقات القيمة 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.

إليك مثال يستخدم واجهة برمجة التطبيقات 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، يُرجى الاطّلاع على حالات العمل ومراقبة العمل.