این سری نوشته ها خلاصه کتاب اموزشی به نام Android Programming: The Big Nerd Ranch Guide که سعی خواهم کرد در حال مطالعه کتاب نکات خلاصه و مفید رو بنویسم
در برنامه های تجاری بطور معمول نیاز به فرایند های دوره ای می باشد ، مثلا هر بار چک میشود که اگر اطلاعات جدیدی ایجاد شده ، به کاربر اعلام گردد .در این مطلب سعی خواهیم کرد نحوه پیاده سازی این کار را توضیح دهیم .
معمولا باید این کارهای دوره ای در پس زمینه انجام شود تا حتی زمانی که کاربر از برنامه استفاده نمیکند هم بتوان آن را اجرا کرد . فرض کنید میخواهیم هر یک ساعت چک کنیم اگر عکس جدیدی به دیتابیس سرور اضافه شده به کاربر اطلاع دهیم .با استفاده از WorkManager که از کتابخانه های Jetpack می باشد ، یک کلاس Worker خواهیم ساخت که چک کردن وجود عکس جدید را در آن تعریف خواهیم کرد و سپس آن را برای اجرا در دوره ی زمانی خاص برنامه ریزی خواهیم کرد .در صورتی که عکس جدیدی وجود داشته در Notification به کاربر اطلاع خواهیم داد .
ابتدا dependency زیر به gradle برنامه اضافه کنید :
implementation "android.arch.work:work-runtime:last_version"
ساخت کلاس Worker :
کلاس اجرایی را با ارث بری از Worker خواهیم ساخت . متد doWork برای درخواست هایی است که میخواهیم در پس زمینه اجرا شود و نوع برگشتی آن از نوع Result می باشد ، که Result.success یعنی کار به درستی انجام شده و Result.failure یعنی اجرا کامل انجام نشده و اجرای درخواست دیگر ادامه نخواهد شد و Result.retry هم یعنی مشکلی در زمان اجرا به وجود امده و شما میخواهید که در درخواست بعدی دوباره سعی شود .
class PollWorker(val context: Context, workerParameters: WorkerParameters) : Worker(context, workerParameters) { override fun doWork(): Result { Log.i(TAG, "Work request triggered") return Result.success() } }
زمانبندی اجرا :
جهت زمانبندی اجرای دستور از WorkRequest استفاده خواهیم کرد . خود کلاس WorkRequest از نوع abstract می باشد و مستقیم از ان ارث بری کرد ولی کلاس های فرزندی دارد که بسته به نوع زمانبندی از آنها ارث بری خواهیم کرد . مثلا اگر میخواهید درخواست چک کردن یکبار اجرا شود از OneTimeWorkRequest و اگر میخواهیم بصورت دوره ای چک شود از PeriodicWorkRequest ارث بری میکنیم :
class PhotoGalleryFragment : Fragment() { ... override fun onCreate(savedInstanceState: Bundle?) { ... lifecycle.addObserver(thumbnailDownloader.fragmentLifecycleObserver) val workRequest = OneTimeWorkRequest .Builder(PollWorker::class.java) .build() WorkManager.getInstance().enqueue(workRequest) }
سپس وقتی که درخواست مثل مثال بالا ساخته شد با استفاده از کلاس WorkManager و گرفتن یک وهله از ان با استفاده از getInstance ، درخواست را جهت اجرا به متد enqueue می فرستیم . با اینکار درخواست مورد نظر در دوره مشخص شده اجرا خواهد شد .
شرط اجرا درخواست :
در ضمن میتوان برای اجرا شدن درخواست ، یک سری شروط نیز تعیین کرد . مثلا در صورت وجود اینترنت شرط اجرا شود یا در صورتی که دستگاه در حال شارژ می باشد . اینکار با کلاس Constraints و تعریف شروط اجرا و اتصال ان به درخواست با setConstraints قابل انجام میباشد .
val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.UNMETERED) .build() val workRequest = OneTimeWorkRequest .Builder(PollWorker::class.java) .setConstraints(constraints) .build() WorkManager.getInstance().enqueue(workRequest)
پیروز باشید