يسمح لك WorkManager بتعديل WorkRequest بعد إجراء
أضافها إلى قائمة الانتظار. هذا ضروري غالبًا في التطبيقات الكبيرة التي تتغير بشكل متكرر
القيود أو يحتاجون إلى تحديث موظفيهم أثناء التنقل. بدءًا من WorkManager
الإصدار 2.8.0، فإن updateWork() API هي الوسيلة المناسبة لإجراء ذلك.
تتيح لك طريقة updateWork() تغيير جوانب معيّنة من
WorkRequest بسهولة بدون الحاجة إلى تنفيذ خطوات العملية يدويًا
إلغاء إضافة جديدة وإدراجها في قائمة الانتظار. يبسط ذلك بشكل كبير عملية تطوير
الدفع.
تجنُّب إلغاء العمل
يجب تجنب إلغاء WorkRequest حالي وإدراج طلب جديد في قائمة انتظار واحد. وقد يؤدي ذلك إلى تكرار مهام معيّنة في التطبيق، وقد يتطلّب منك ذلك. لكتابة كمية كبيرة من التعليمات البرمجية الإضافية.
يمكنك مراجعة الأمثلة التالية حول الحالات التي يمكن أن يؤدي فيها إلغاء WorkRequest إلى الصعوبات:
- طلب الواجهة الخلفية: إذا ألغيت
Workerأثناء عملية الحوسبة حمولة بيانات لإرسالها إلى الخادم، يجب أن يبدأWorkerالجديد من جديد لإعادة حساب الحمولة المحتملة المكلفة. - الجدولة: إذا ألغيت
PeriodicWorkRequestوكنت مثل "PeriodicWorkRequest" الجديدة، لتنفيذها في الجدول الزمني نفسه، يجب لاحتساب معادلة الوقت لضمان توافق وقت التنفيذ الجديد مع طلب العمل السابق.
تسمح لك واجهة برمجة التطبيقات updateWork() بتعديل القيود والمتطلبات الخاصة بطلب العمل.
معلمات أخرى بدون الحاجة إلى إلغاء طلب جديد وإدراجه في قائمة الانتظار.
وقت إلغاء العمل
في بعض الحالات، عليك إلغاء WorkRequest مباشرةً بدلاً من
الاتصال بـ updateWork(). هذا ما يجب عليك فعله عندما تريد تغيير
الطبيعة الأساسية للعمل الذي أضفته إلى قائمة الانتظار.
وقت تحديث ملف العمل
تخيل تطبيقًا للصور يحفظ نسخة احتياطية يومية من صور المستخدم. تحتوي على
تمت إضافة PeriodicWorkRequest إلى قائمة الانتظار لإجراء ذلك. هناك قيود في "WorkRequest"
التي تتطلّب شحن الجهاز واتصاله بشبكة WiFi.
ومع ذلك، لا يشحن المستخدم سوى جهازه لمدة 20 دقيقة في اليوم باستخدام
شاحن. في هذه الحالة، قد يحتاج التطبيق إلى تحديث WorkRequest لتخفيف
بحيث يظل بالإمكان تحميل الصور حتى إذا كان الجهاز
لم يتم شحنه بالكامل.
في هذه الحالة، يمكنك استخدام طريقة updateWork() لتعديل العمل.
قيود الطلب.
كيفية تحديث ملف العمل
توفّر الطريقة updateWork() وسيلة بسيطة لتحديث ملف حالي.
WorkRequest، بدون الحاجة إلى إلغاء اشتراك جديد وإدراجه في قائمة الانتظار.
لاستخدام التحديث المدرج في قائمة الانتظار، يُرجى اتّباع الخطوات التالية:
- الحصول على المعرّف الحالي للعمل المدرج: احصل على معرّف WorkRequest لك
تريد إجراء تحديث. ويمكنك استرداد هذا المعرّف باستخدام أي من
واجهات برمجة تطبيقات
getWorkInfoأو من خلال الاحتفاظ برقم التعريف يدويًا من WorkRequest للاسترجاع لاحقًا باستخدام الملكية العامةWorkRequest.idقبل إضافته إلى قائمة الانتظار - إنشاء طلب عمل جديد: إنشاء
WorkRequestجديد واستخدامهWorkRequest.Builder.setID()لضبط رقم تعريفه بحيث يتطابق مع رقم التعريف الحاليWorkRequest - ضبط قيود: استخدِم "
WorkRequest.Builder.setConstraints()" لاجتياز قيود جديدة في WorkManager. - طلب تحديثWorkWork: أدخِل طلب WorkRequest الجديد إلى
updateWork().
تعديل مثال العمل
وفيما يلي مثال لمقتطف رمز في Kotlin يوضح كيفية استخدام
طريقة updateWork() لتغيير قيود البطارية لجهاز WorkRequest المستخدَم
لتحميل الصور:
suspend fun updatePhotoUploadWork() {
// Get instance of WorkManager.
val workManager = WorkManager.getInstance(context)
// Retrieve the work request ID. In this example, the work being updated is unique
// work so we can retrieve the ID using the unique work name.
val photoUploadWorkInfoList = workManager.getWorkInfosForUniqueWork(
PHOTO_UPLOAD_WORK_NAME
).await()
val existingWorkRequestId = photoUploadWorkInfoList.firstOrNull()?.id ?: return
// Update the constraints of the WorkRequest to not require a charging device.
val newConstraints = Constraints.Builder()
// Add other constraints as required here.
.setRequiresCharging(false)
.build()
// Create new WorkRequest from existing Worker, new constraints, and the id of the old WorkRequest.
val updatedWorkRequest: WorkRequest =
OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(newConstraints)
.setId(existingWorkRequestId)
.build()
// Pass the new WorkRequest to updateWork().
workManager.updateWork(updatedWorkRequest)
}
التعامل مع النتيجة
تعرض الدالة updateWork() القيمة ListenableFuture<UpdateResult>.
يمكن أن يحتوي UpdateResult على إحدى القيم العديدة التي تحدد ما إذا كانت
تمكّن WorkManager من تطبيق التغييرات. كما يشير أيضًا إلى الوقت الذي تمكن فيه
لتطبيق التغيير.
لمزيد من المعلومات، يُرجى الاطّلاع على updateWork() و UpdateResult.
المرجع.
تتبُّع العمل مع الأجيال
في كل مرة يتم فيها تعديل WorkRequest، يزيد إنشاء عنصر بمقدار واحد. هذا النمط
يسمح لك بتتبع WorkRequest المحدد حاليًا في قائمة الانتظار.
تمنحك الأجيال المزيد من التحكم عند مراقبة الأعمال وتتبُّعها واختبارها
الطلبات.
لإنشاء جهاز WorkRequest، يُرجى اتّباع الخطوات التالية:
- WorkInfo: يجب الاتصال بـ
WorkManager.getWorkInfoById()لاسترداد أحد المثيلات. منWorkInfoبما يتوافق معWorkRequest.- يمكنك استدعاء إحدى الطرق العديدة التي تعرض
WorkInfo. لمزيد من المعلومات، معلومات، يُرجى الاطِّلاع على مرجع WorkManager.
- يمكنك استدعاء إحدى الطرق العديدة التي تعرض
- getGeneration: طلب
getGeneration()على مثيلWorkInfoتتجاوب القيمةIntالتي تم إرجاعها مع عملية إنشاءWorkRequest- لاحظ أنه لا يوجد حقل أو خاصية إنشاء، بل
طريقة
WorkInfo.getGeneration().
- لاحظ أنه لا يوجد حقل أو خاصية إنشاء، بل
طريقة
مثال على إنشاء قناة الإصدار
فيما يلي مثال على تنفيذ سير العمل الموضح أعلاه
استرداد عملية إنشاء WorkRequest.
// Get instance of WorkManager.
val workManager = WorkManager.getInstance(context)
// Retrieve WorkInfo instance.
val workInfo = workManager.getWorkInfoById(oldWorkRequestId)
// Call getGeneration to retrieve the generation.
val generation = workInfo.getGeneration()
سياسات تحديث العمل
في السابق، كان الحل الموصى به لتحديث العمل الدوري هو إدراج قائمة انتظار
PeriodicWorkRequest مع السياسة ExistingPeriodicWorkPolicy.REPLACE.
إذا كانت هناك سمة PeriodicWorkRequest في انتظار المراجعة لها قيمة id الفريدة نفسها، سيتم تغيير
طلب العمل يلغيه ويحذفه. تم إيقاف هذه السياسة الآن في
لصالح سير العمل باستخدام ExistingPeriodicWorkPolicy.UPDATE.
على سبيل المثال، عند استخدام enqueueUniquePeriodicWork مع
PeriodicWorkRequest، يمكنك إعداد PeriodicWorkRequest الجديد باستخدام
سياسة ExistingPeriodicWorkPolicy.UPDATE إذا كانت هناك مشكلة في انتظار المراجعة
PeriodicWorkRequest يحمل الاسم الفريد نفسه، ويتم تحديثه إلى WorkManager.
المواصفات الجديدة. باتباع سير العمل هذا، ليس من الضروري استخدام
updateWork()