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

توفّر 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();
    }
}

مراقبة مستوى التقدّم

لمراقبة معلومات التقدّم، استخدِم طُرق 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، يُرجى قراءة حالات العمل ومراقبة العمل. لمعرفة كيفية الحصول على stopReason عندما يتوقف العمل بشكل غير متوقع، يمكنك الرجوع إلى مراقبة حالة سبب التوقف.