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(); } }
مشاهده اطلاعات پیشرفت نیز ساده است. میتوانید از متدهای getWorkInfoBy…()
یا getWorkInfoBy…LiveData()
استفاده کنید و به WorkInfo
مراجعه کنید.
در اینجا یک مثال است که از getWorkInfoByIdLiveData
API استفاده می کند.
WorkManager.getInstance(applicationContext) // requestId is the WorkRequest id .getWorkInfoByIdLiveData(requestId) .observe(observer, Observer { 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
، وضعیت کار و مشاهده کار را بخوانید.