WorkManager دارای پشتیبانی داخلی برای تنظیم و مشاهده پیشرفت میانی برای worker است. اگر کارگر درحالیکه برنامه در پیشزمینه بود اجرا میشد، این اطلاعات را میتوان بااستفاده از APIهایی که LiveData مربوط به WorkInfo را برمیگردانند نیز به کاربر نشان داد.
ListenableWorker اکنون از
setProgressAsync()
API پشتیبانی میکند که به آن اجازه میدهد پیشرفت میانی را حفظ کند. این میاناهای برنامهسازی کاربردی به توسعهدهندگان اجازه میدهد پیشرفت میانی را تنظیم کنند تا میانای کاربر بتواند آن را مشاهده کند.
پیشرفت با نوع Data نشان داده میشود،
که محفظه قابلسریالسازی از ویژگیها است (مشابه input و
output،
و مشمول همان محدودیتها است).
اطلاعات پیشرفت را فقط زمانی میتوان مشاهده و بهروزرسانی کرد که
ListenableWorker درحال اجرا باشد. تلاش برای تنظیم پیشرفت در ListenableWorker
پساز تکمیل اجرای آن نادیده گرفته میشود.
همچنین میتوانید بااستفاده از یکی از روشهای getWorkInfoBy…() یا
getWorkInfoBy…LiveData()
اطلاعات پیشرفت را مشاهده کنید. این روشها نمونههایی از
WorkInfo را برمیگردانند که روش جدید
getProgress()
دارد که Data را برمیگرداند.
بهروزرسانی پیشرفت
برای توسعهدهندگان Java که از ListenableWorker
یا Worker استفاده میکنند،
setProgressAsync()
API یک ListenableFuture<Void> برمیگرداند؛ بهروزرسانی پیشرفت ناهمگام است،
با توجه به اینکه فرایند بهروزرسانی شامل ذخیره اطلاعات پیشرفت در پایگاه داده است.
در Kotlin، میتوانید از تابع افزونه 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 برای 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، میتوانید دلیل توقف را با فراخوانی
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،
وضعیتهای کار را بخوانید.