آموزش WorkManager و زمانبندی وظایف با WorkManager در اندروید ، در نسخه های پیشین اندروید ما از Broadcast ها برای زمانبندی وظایف و یا مدیریت تسک های غیر منتظره استفاده میکردیم.
اما در نسخه های جدید اندروید مبحث دیگری بنام WorkManager ارائه داد که با کیفیت بهتر توانست خود را جایگزین کند که در این آموزش ما به صورت کامل WorkManager را بررسی خواهیم کرد پس با ما همراه باشید 🙂
برای تعریف این مولفه میتوان گفت api های WorkManager برای زمانبندی وظایف یا تسک های ناپیوسته (برای مثال گرفتن دیتا از سرور) و غیرقابل انتظار (برای مثال گرفتن یک نوتیفکیشن خاص) بکار می رود حتی زمانیکه از اپ خارج شده ایم و یا دستگاه ری استارت شده باشد
در واقع میتوان گفت WorkManager برای کار های صد درصدی استفاده میشود بدین معنی که در هر صورتی (حتی اگر دستگاه ری استارت شود) وظیفه مورد نظر به انجام برسد و نه کارهای بلافاصله ای مثل :
خب بریم سراغ یک مثال عملی از WorkManager و زمانبندی وظایف با WorkManager در اندروید
برای استفاده از WorkManager در پروژه ابتدا باید وابستگی یا dependency های مربوط به اون رو به پروژه اضافه کنیم
allprojects {
repositories {
google()
...
}
}
نکته قابل توجه این است که برای استفاده از WorkManager باید از compileSdk 28 به بالا استفاده کنیم.
همچنین میتونید وابستگی های AndroidX و Pre-AndroidX رو هم برای کارایی بهتر به گردل اضافه کنیم.
همه چیز درباره AndroidX جانشین Support Library
dependencies {
def work_version = 2.0.0
// (Java only)
implementation "androidx.work:work-runtime:$work_version"
// Kotlin + coroutines
implementation "androidx.work:work-runtime-ktx:$work_version"
// optional - RxJava2 support
implementation "androidx.work:work-rxjava2:$work_version"
// optional - Test helpers
androidTestImplementation "androidx.work:work-testing:$work_version"
}
همچنین وابستگی های Pre-AndroidX
dependencies {
def work_version = 1.0.0
// (Java only)
implementation "android.arch.work:work-runtime:$work_version"
// Kotlin + coroutines
implementation "android.arch.work:work-runtime-ktx:$work_version"
// optional - RxJava2 support
implementation "android.arch.work:work-rxjava2:$work_version"
// optional - Test helpers
androidTestImplementation "android.arch.work:work-testing:$work_version"
}
یک وظیفه ایجاد شده که از کلاس Worker استفاده میکند . متد doWrok() برای اجرای همگام ترد ها در پس زمینه با workmanager استفاده میشود.
برای ایجاد یک تسک بک گراند شما باید یک کلاس ایجاد کنید و آنرا از کلاس Worker ارث بری (extend) کنید و همچنین متد doWork رو override یا فراخوانی کنید
در مثال زیر ما یک کلاس برای آپلود کردن عکس با کانفیگی که در بالا گفته شد ایجاد کردیم
کاتلین
class UploadWorker(appContext: Context, workerParams: WorkerParameters)
: Worker(appContext, workerParams) {
override fun doWork(): Result {
// Do the work here--in this case, upload the images.
uploadImages()
// Indicate whether the task finished successfully with the Result
return Result.success()
}
}
جاوا
public class UploadWorker extends Worker {
public UploadWorker(
@NonNull Context context,
@NonNull WorkerParameters params) {
super(context, params);
}
@Override
public Result doWork() {
// Do the work here--in this case, upload the images.
uploadImages()
// Indicate whether the task finished successfully with the Result
return Result.success()
}
}
مقدار Result از متد doWork برگردانده شده و مشخص میکند که از کدام یک از انواع زیر است :
کلاس دیگری بنام WorkRequest وجود دارد که مشخص کننده زمان و چگونگی اجرای وظیفه یا تسک است.
توجه داشته باشید که تسک های شما ممکن است یک باره یا تناوبی باشند.
برای وظایف یکباره میتوانید از کلاس OneTimeWorkRequest و برای وظایف تناوبی میتوانید از کلاس PeriodicTimeWorkRequest استفاده کنید.
در مثال زیر ما تسک آپلود عکس را بصورت یکباره ایجاد کرده ایم
کاتلین
val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
.build()
جاوا
OneTimeWorkRequest uploadWorkRequest = new OneTimeWorkRequest.Builder(UploadWorker.class)
.build()
همچنین کلاس WorkRequest میتونه اطلاعات اظافی (additional) رو به درخواست اضافه کند برای مثال محدودیت هایی برروی وظایفی که میخواهند اجرا شوند , تاخیر , بازه زمانی برای درخواست مجدد و .. که در مقاله به صورت کامل توضیح داده شده
پس از مشخص کردن درخواست با استفاده از WorkRequest حال زمان آن ست که وظیفه را با WorkManager با استفاده از enqueue() زمانبندی کنیم
کاتلین
WorkManager.getInstance().enqueue(uploadWorkRequest)
جاوا
WorkManager.getInstance().enqueue(uploadWorkRequest);
2 Comments
هر کاری کردم هیچ کنترلی نتونستم رویه بازه های زمانی اجرایی این داشته باشم
تنها کاری که من نیاز داشتم این بود که هر ۶۰ ثانیه یک بار به سرور وصل بشه و یه سری اطلاعات رو از سرور بخونه و اگه پیغام جدیدی بود به صورت نوتیفیکیشن به کاربر اطلاع بده
PeriodicWorkRequest simpleRequest1 = new PeriodicWorkRequest.Builder(MyWorker.class,60,TimeUnit.SECONDS).addTag(“periodic_work”).build();
یا
PeriodicWorkRequest simpleRequest1 = new PeriodicWorkRequest.Builder(MyWorker.class,5,TimeUnit.SECONDS,60,TimeUnit.SECONDS).addTag(“periodic_work”).build();
رویه سرور لاک گذاشتم دفعه اول تویه ۵ ثانیه لاک ثبت میشه
ولی لاک های بعدی اختلاف زمانیشون به ۱۰ ۲۰ دقیقه میرسه
طبق بررسی هایی که کردم متوجه شدم حداقل زمان برای استفاده ازش ۱۵ دقیقه تعیین شده
MIN_PERIODIC_INTERVAL_MILLIS
public static final long MIN_PERIODIC_INTERVAL_MILLIS
The minimum interval duration for PeriodicWorkRequest (in milliseconds).
Constant Value: 900000 (0x00000000000dbba0)