WorkManager از تنظیم و مشاهدهی پیشرفت میانی برای workerها پشتیبانی داخلی دارد. اگر worker در حالی که برنامه در پیشزمینه بود، در حال اجرا بود، این اطلاعات را میتوان با استفاده از APIهایی که LiveData مربوط به WorkInfo را برمیگردانند، به کاربر نشان داد.
ListenableWorker اکنون از API مربوط به setProgressAsync() پشتیبانی میکند که به آن اجازه میدهد پیشرفت میانی را حفظ کند. این APIها به توسعهدهندگان اجازه میدهند پیشرفت میانی را که توسط رابط کاربری قابل مشاهده است، تنظیم کنند. پیشرفت توسط نوع Data type) نمایش داده میشود که یک ظرف قابل سریالسازی از ویژگیها است (مشابه input و output ، و مشمول همان محدودیتها).
اطلاعات پیشرفت فقط در حین اجرای ListenableWorker قابل مشاهده و بهروزرسانی است. تلاشها برای تنظیم پیشرفت در ListenableWorker پس از اتمام اجرای آن، نادیده گرفته میشوند.
همچنین میتوانید اطلاعات پیشرفت را با استفاده از یکی از متدهای getWorkInfoBy…() یا getWorkInfoBy…LiveData() مشاهده کنید. این متدها نمونههایی از WorkInfo را برمیگردانند که دارای یک متد جدید getProgress() است که Data برمیگرداند.
پیشرفت بهروزرسانی
برای توسعهدهندگان جاوا که از ListenableWorker یا Worker استفاده میکنند، API مربوط به setProgressAsync() یک ListenableFuture<Void> برمیگرداند؛ بهروزرسانی پیشرفت ناهمزمان است، با توجه به اینکه فرآیند بهروزرسانی شامل ذخیره اطلاعات پیشرفت در یک پایگاه داده است. در کاتلین، میتوانید از تابع الحاقی setProgress() شیء CoroutineWorker برای بهروزرسانی اطلاعات پیشرفت استفاده کنید.
این مثال یک ProgressWorker را نشان میدهد. Worker هنگام شروع، پیشرفت خود را روی ۰ تنظیم میکند و پس از اتمام، مقدار پیشرفت را به ۱۰۰ بهروزرسانی میکند.
کاتلین
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 برای کاتلین و 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 ، میتوانید دلیل توقف را با فراخوانی WorkInfo.getStopReason() ثبت کنید:
کاتلین
workManager.getWorkInfoByIdFlow(syncWorker.id)
.collect { workInfo ->
if (workInfo != null) {
val stopReason = workInfo.stopReason
logStopReason(syncWorker.id, stopReason)
}
}
جاوا
workManager.getWorkInfoByIdLiveData(syncWorker.id)
.observe(getViewLifecycleOwner(), workInfo -> {
if (workInfo != null) {
int stopReason = workInfo.getStopReason();
logStopReason(syncWorker.id, workInfo.getStopReason());
}
});
برای مستندات بیشتر در مورد چرخه حیات و وضعیت اشیاء Worker ، بخش Work states را مطالعه کنید.