WorkManager به شما امکان میدهد زنجیرهای از کارها را ایجاد و صفبندی کنید که چندین تکلیف وابسته را مشخص میکند و ترتیب اجرای آنها را تعریف میکند. این عملکرد بهویژه زمانی مفید است که لازم باشد چند تکلیف را بهترتیب خاصی اجرا کنید.
برای ایجاد زنجیره کار، میتوانید از
WorkManager.beginWith(OneTimeWorkRequest)
یا
WorkManager.beginWith(List<OneTimeWorkRequest>)
استفاده کنید که هرکدام نمونهای از
WorkContinuation
را برمیگردانند.
سپس میتوان از WorkContinuation برای افزودن نمونههای وابسته OneTimeWorkRequest بااستفاده از
then(OneTimeWorkRequest)
یا
then(List<OneTimeWorkRequest>)
استفاده کرد.
هر فراخوانی WorkContinuation.then(...) یک نمونه جدید از WorkContinuation را برمیگرداند. اگر List از نمونههای OneTimeWorkRequest را اضافه کنید، این درخواستها میتوانند بهطور موازی اجرا شوند.
درنهایت، میتوانید از روش
WorkContinuation.enqueue()
برای enqueue() کردن زنجیره WorkContinuation استفاده کنید.
بیایید به یک مثال نگاه کنیم. در این مثال، ۳ کار Worker مختلف برای اجرا پیکربندی شدهاند (احتمالاً بهصورت موازی). سپس نتایج این Workerها بههم میپیوندند و به کار Worker ذخیرهسازی در حافظه نهان منتقل میشوند. درنهایت، خروجی آن کار به یک Worker بارگذاری منتقل میشود که نتایج را به یک سرور راه دور بارگذاری میکند.
کاتلین
WorkManager.getInstance(myContext) // Candidates to run in parallel .beginWith(listOf(plantName1, plantName2, plantName3)) // Dependent work (only runs after all previous work in chain) .then(cache) .then(upload) // Call enqueue to kick things off .enqueue()
جاوا
WorkManager.getInstance(myContext) // Candidates to run in parallel .beginWith(Arrays.asList(plantName1, plantName2, plantName3)) // Dependent work (only runs after all previous work in chain) .then(cache) .then(upload) // Call enqueue to kick things off .enqueue();
ادغامهای ورودی
وقتی نمونههای OneTimeWorkRequest را زنجیرهای میکنید، خروجی درخواستهای کار والد بهعنوان ورودی به فرزندان منتقل میشود. بنابراین در مثال بالا،
خروجیهای plantName1، plantName2، و plantName3 بهعنوان
ورودیهای درخواست cache ارسال میشوند.
برای مدیریت ورودیهای چند درخواست کار والد، WorkManager از
InputMerger استفاده میکند.
دو نوع مختلف InputMerger وجود دارد که WorkManager ارائه میدهد:
OverwritingInputMergerتلاش میکند همه کلیدها را از همه ورودیها به خروجی اضافه کند. درصورت وجود تداخل، کلیدهای قبلاً تنظیمشده را بازنویسی میکند.ArrayCreatingInputMergerتلاش میکند ورودیها را ادغام کند و درصورت لزوم آرایه ایجاد میکند.
اگر مورد استفاده خاصتری دارید، میتوانید با زیرکلاسبندی
InputMerger، مورد استفاده خودتان را بنویسید.
OverwritingInputMerger
OverwritingInputMerger روش ادغام پیشفرض است. اگر در ادغام تداخل کلید وجود داشته باشد، آخرین مقدار برای کلید، نسخههای قبلی را در دادههای خروجی حاصل بازنویسی میکند.
برای مثال، اگر ورودیهای کارخانه هرکدام کلیدی داشته باشند که با نام متغیر مربوطه آنها ("plantName1"، "plantName2"، و "plantName3") مطابقت داشته باشد، دادههای ارسالشده به کارگر cache دارای سه جفت کلید-مقدار خواهند بود.
اگر تداخلی وجود داشته باشد، آخرین کارگری که تکمیل میکند «برنده میشود» و مقدار آن
به cache منتقل میشود.
چون درخواستهای کار شما بهطور موازی اجرا میشوند، تضمینی برای ترتیب اجرای آنها وجود ندارد. در مثال بالا، plantName1 میتواند مقدار "tulip" یا "elm" را داشته باشد، بسته به اینکه کدام مقدار آخر نوشته شده باشد. اگر احتمال تداخل کلید وجود دارد و باید همه دادههای خروجی را در ادغام حفظ کنید، ArrayCreatingInputMerger ممکن است گزینه بهتری باشد.
ArrayCreatingInputMerger
برای مثال بالا، با توجه به اینکه میخواهیم خروجیهای همه «کارگران» نام گیاه را حفظ کنیم، باید از ArrayCreatingInputMerger استفاده کنیم.
کاتلین
val cache: OneTimeWorkRequest = OneTimeWorkRequestBuilder<PlantWorker>() .setInputMerger(ArrayCreatingInputMerger::class) .setConstraints(constraints) .build()
جاوا
OneTimeWorkRequest cache = new OneTimeWorkRequest.Builder(PlantWorker.class) .setInputMerger(ArrayCreatingInputMerger.class) .setConstraints(constraints) .build();
ArrayCreatingInputMerger هر کلید را با یک آرایه جفت میکند. اگر هرکدام از کلیدها
یکتا باشد، نتیجه شما مجموعهای از آرایههای تکعنصری است.
اگر تداخل کلیدی وجود داشته باشد، مقادیر متناظر در یک آرایه گروهبندی میشوند.
وضعیتهای زنجیرهای و کاری
زنجیرههای OneTimeWorkRequest بهصورت متوالی اجرا میشوند تا زمانی که کارشان
با موفقیت تکمیل شود (یعنی Result.success() را برگردانند). درخواستهای کار
ممکن است درحین اجرا ناموفق باشند یا لغو شوند، که این امر تأثیرات پاییندستی بر
درخواستهای کار وابسته دارد.
وقتی اولین OneTimeWorkRequest در زنجیره درخواستهای کار در صف قرار میگیرد،
همه درخواستهای کار بعدی مسدود میشوند تا زمانی که کار اولین درخواست کار
تکمیل شود.
وقتی در صف قرار گرفت و همه محدودیتهای کار برآورده شد، اولین درخواست کار
شروع به اجرا میکند. اگر کار با موفقیت در ریشه
OneTimeWorkRequest یا List<OneTimeWorkRequest> تکمیل شود (یعنی
Result.success() را برگرداند)، سپس مجموعه بعدی درخواستهای کار وابسته
در صف قرار خواهد گرفت.
تا زمانی که هر درخواست کار با موفقیت تکمیل شود، همین الگو در بقیه زنجیره درخواستهای کار شما منتشر میشود تا زمانی که تمام کارهای زنجیره تکمیل شوند. اگرچه این سادهترین و اغلب ترجیحیترین حالت است، اما رسیدگی به حالتهای خطا نیز به همان اندازه مهم است.
وقتی خطایی درحین پردازش درخواست کار شما توسط کارگر رخ میدهد، میتوانید آن درخواست را طبق خطمشی عقبنشینی که تعریف میکنید دوباره امتحان کنید. امتحان مجدد درخواستی که بخشی از یک زنجیره است به این معنی است که فقط آن درخواست با دادههای ورودی ارائهشده به آن دوباره امتحان خواهد شد. هر کاری که بهطور موازی اجرا میشود تحت تأثیر قرار نخواهد گرفت.
برای اطلاعات بیشتر درباره تعریف کردن استراتژیهای تکرار سفارشی، به خطمشی تکرار و عقبنشینی مراجعه کنید.
اگر آن خطمشی تلاش مجدد تعریف نشده باشد یا منقضی شده باشد، یا به هر دلیل دیگری به وضعیتی برسید که در آن OneTimeWorkRequest مقدار Result.failure() را برگرداند، آن درخواست کار و همه درخواستهای کار وابسته بهعنوان FAILED. علامتگذاری میشوند.
وقتی OneTimeWorkRequest لغو شود، همین منطق اعمال میشود. هرگونه درخواست کار وابسته نیز با CANCELLED علامتگذاری میشود و کار آنها اجرا نخواهد شد.
توجه داشته باشید که اگر درخواستهای کار بیشتری را به زنجیرهای که ناموفق بوده است یا
درخواستهای کار لغوشده دارد اضافه کنید، درخواست کار جدیدی که اضافه کردهاید نیز بهترتیب
بهعنوان FAILED یا CANCELLED علامتگذاری خواهد شد. اگر میخواهید کار زنجیره موجودی را گسترش دهید، APPEND_OR_REPLACE را در ExistingWorkPolicy ببینید.
هنگام ایجاد زنجیرههای درخواستهای کاری، درخواستهای کاری وابسته باید خطمشیهای تکرار مجدد را تعریف کنند تا اطمینان حاصل شود که کار همیشه بهموقع تکمیل میشود. درخواستهای کاری ناموفق میتواند منجر به زنجیرههای ناقص و/یا وضعیت غیرمنتظره شود.
برای اطلاعات بیشتر، لغو و توقف کار را ببینید.