يسمح لك 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()