اضافه کردن دامنه سفارشی و نصب SSL بر روی Localhost
نحوه اضافه کردن دامنه سفارشی و نصب SSL (HTTPS) بر روی Localhost
1398-01-16
ساخت RESTful API در لاراول با Passport
ساخت RESTful API برای عملیات CRUD در لاراول به همراه احراز هویت با استفاده از Passport
1398-01-17

آموزش زمانبندی وظایف با WorkManager در اندروید

آموزش زمانبندی وظایف با WorkManager در اندروید

آموزش زمانبندی وظایف با WorkManager در اندروید

آموزش WorkManager و زمانبندی وظایف با WorkManager در اندروید ، در نسخه های پیشین اندروید ما از Broadcast ها برای زمانبندی وظایف و یا مدیریت تسک های غیر منتظره استفاده میکردیم.
اما در نسخه های جدید اندروید مبحث دیگری بنام WorkManager ارائه داد که با کیفیت بهتر توانست خود را جایگزین کند که در این آموزش ما به صورت کامل WorkManager را بررسی خواهیم کرد پس با ما همراه باشید 🙂

آموزش WorkManager در اندروید

برای تعریف این مولفه میتوان گفت api های WorkManager برای زمانبندی وظایف یا تسک های ناپیوسته (برای مثال گرفتن دیتا از سرور) و غیرقابل انتظار (برای مثال گرفتن یک نوتیفکیشن خاص) بکار می رود حتی زمانیکه از اپ خارج شده ایم و یا دستگاه ری استارت شده باشد

ویژگی های کلیدی WorkManager

  • سازگاری با نسخه های ۱۴به بالا
  • استفاده از JobScheduler روی دستگاه های با نسخه ۲۳ به بالا
  • استفاده از ترکیب ‌BroadcastReceiver + AlarmManager برروی دستگاه های ۱۴ تا ۲۲
  • قابلیت اضافه کردن کارهای محدودی برروی دسترسی به شبکه یا وضعیت شارژ
  • برنامه زمانبندی غیر همزمان یا دوره ای
  • نظارت و مدیریت برنامه زمانبندی وظایف
  • زنجیر کردن وظایف به یکدیگر
  • تضمین انجام وظیفه حتی اگر دستگاه ری استارت شود !

در واقع میتوان گفت WorkManager برای کار های صد درصدی استفاده میشود بدین معنی که در هر صورتی (حتی اگر دستگاه ری استارت شود) وظیفه مورد نظر به انجام برسد و نه کارهای بلافاصله ای مثل :

  • ارسال لاگ یا آنالیز به بک اند
  • سینک شدن دوره ای اپلیکیشن با سرور

یک مثال عملی از 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 برگردانده شده و مشخص میکند که از کدام یک از انواع زیر است :

  • با موفقیت به اتمام رسیده Result.success()
  • شکست خورده Result.failure()
  • نیاز به تکرار در زمانی دیگر دارد Result.retry()

کانفیگ کردن اینکه چه زمانی و چگونه وظیفه (task) انجام شود

کلاس دیگری بنام 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);

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *