پیشرفت کارگر متوسط ​​را مشاهده کنید

WorkManager پشتیبانی داخلی برای تنظیم و مشاهده پیشرفت متوسط ​​برای کارگران دارد. اگر کارگر در حالی که برنامه در پیش‌زمینه بود اجرا می‌شد، این اطلاعات همچنین می‌تواند با استفاده از APIهایی که LiveData WorkInfo را برمی‌گردانند به کاربر نشان داده شود.

ListenableWorker اکنون از API setProgressAsync() پشتیبانی می کند که به آن اجازه می دهد پیشرفت متوسط ​​​​را ادامه دهد. این APIها به توسعه‌دهندگان اجازه می‌دهند تا پیشرفت‌های متوسطی را تنظیم کنند که می‌تواند توسط UI مشاهده شود. پیشرفت با نوع Data نشان داده می شود، که محفظه ای از ویژگی های قابل سریال سازی است (مشابه input و output ، و مشمول همان محدودیت ها).

اطلاعات پیشرفت را فقط می توان در زمانی که ListenableWorker در حال اجرا است مشاهده و به روز کرد. تلاش برای تنظیم پیشرفت در ListenableWorker پس از اتمام اجرای آن نادیده گرفته می شود.

همچنین می توانید با استفاده از یکی از متدهای getWorkInfoBy…() یا getWorkInfoBy…LiveData() اطلاعات پیشرفت را مشاهده کنید. این متدها نمونه‌هایی از WorkInfo را برمی‌گردانند که دارای یک متد getProgress() جدید است که Data برمی‌گرداند.

به روز رسانی پیشرفت

برای توسعه دهندگان جاوا که از ListenableWorker یا Worker استفاده می کنند، API setProgressAsync() ListenableFuture<Void> برمی گرداند. پیشرفت به روز رسانی ناهمزمان است، با توجه به اینکه فرآیند به روز رسانی شامل ذخیره اطلاعات پیشرفت در یک پایگاه داده است. در Kotlin، می توانید از تابع پسوند setProgress() شیء CoroutineWorker برای به روز رسانی اطلاعات پیشرفت استفاده کنید.

این مثال یک ProgressWorker نشان می دهد. Worker هنگام شروع به کار پیشرفت خود را روی 0 تنظیم می کند و پس از اتمام، مقدار پیشرفت را به 100 به روز می کند.

کاتلین

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()
    }
}

جاوا

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 برای جاوا استفاده می کند.

کاتلین

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
          }
      }

جاوا

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 هنگامی که کار به طور غیرمنتظره ای پایان می یابد، به Observe stop reason state مراجعه کنید.