يتيح لك 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
.
لنلقِ نظرة على مثال ما. في هذا المثال، يتم تهيئة 3 مهام عاملة مختلفة للتشغيل (من المحتمل أن تكون بالتوازي). يتم بعد ذلك ضم نتائج هؤلاء العاملين وتمريرها إلى مهمة عامل تخزين مؤقت. وأخيرًا، يتم تمرير ناتج تلك الوظيفة إلى عامل تحميل، الذي يحمِّل النتائج إلى خادم بعيد.
Kotlin
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()
Java
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
.
يقدّم WorkManager نوعَين مختلفَين من InputMerger
:
OverwritingInputMerger
يحاول إضافة جميع المفاتيح من جميع المدخلات إلى المخرج. في حالة حدوث تعارض، يستبدل المفاتيح التي تم تعيينها مسبقًا.ArrayCreatingInputMerger
يحاول دمج المدخلات وإنشاء صفائف عند الضرورة.
وإذا كانت لديك حالة استخدام أكثر تحديدًا، يمكنك كتابة حالة الاستخدام الخاصة بك عن طريق التصنيف الفرعي InputMerger
.
استبدال إدخال عملية الدمج
وOverwritingInputMerger
هي طريقة الدمج التلقائية. إذا كانت هناك مشكلات أساسية في عملية الدمج، ستحل أحدث قيمة للمفتاح محل أي إصدارات سابقة في بيانات الإخراج الناتجة.
على سبيل المثال، إذا كان لكل من إدخالات النباتات مفتاح يطابق أسماء المتغيرات الخاصة بكل منها ("plantName1"
و"plantName2"
و"plantName3"
)، ستحتوي البيانات التي يتم تمريرها إلى عامل cache
على ثلاثة أزواج من المفاتيح/القيمة.
وإذا كان هناك تعارض، يعني ذلك أنّ آخر عامل أكمل مقياس "فوز" وسيتم تمرير قيمته إلى cache
.
نظرًا لأنه يتم تنفيذ طلبات عملك بالتوازي، فليست لديك أي ضمانات للترتيب الذي يتم تنفيذه به. في المثال أعلاه، يمكن أن يشتمل plantName1
على
قيمة "tulip"
أو "elm"
، بناءً على القيمة المكتوبة
في آخر مرة. إذا كانت هناك فرصة لحدوث تعارض رئيسي وكنت بحاجة إلى الاحتفاظ بجميع بيانات المخرجات
في عملية دمج، قد تكون ArrayCreatingInputMerger
خيارًا أفضل.
مصفوفة إنشاء إدخال الدمج
في المثال أعلاه، بما أنّنا نريد الاحتفاظ بمخرجات جميع عمال أسماء النباتات، يجب استخدام ArrayCreatingInputMerger
.
Kotlin
val cache: OneTimeWorkRequest = OneTimeWorkRequestBuilder<PlantWorker>() .setInputMerger(ArrayCreatingInputMerger::class) .setConstraints(constraints) .build()
Java
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
في CurrentWorkPolicy.
عند إنشاء سلاسل من طلبات العمل، يجب أن تحدد طلبات العمل التابعة سياسات إعادة المحاولة لضمان إنجاز العمل دائمًا في الوقت المناسب. قد تؤدي طلبات العمل غير الناجحة إلى سلاسل غير مكتملة و/أو حالة غير متوقعة.
لمزيد من المعلومات، يُرجى الاطّلاع على إلغاء العمل وإيقافه.