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

توفّر 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 وحالاتها، اطّلِع على حالات العمل.