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
، میتوانید دلیل توقف را با فراخوانی 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
، وضعیت های کاری را بخوانید.