تعديل العمل الذي تمت إضافته إلى قائمة الانتظار بالفعل

يسمح لك 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، بدون الحاجة إلى إلغاء اشتراك جديد وإدراجه في قائمة الانتظار.

لاستخدام التحديث المدرج في قائمة الانتظار، يُرجى اتّباع الخطوات التالية:

  1. الحصول على المعرّف الحالي للعمل المدرج: احصل على معرّف WorkRequest لك تريد إجراء تحديث. ويمكنك استرداد هذا المعرّف باستخدام أي من واجهات برمجة تطبيقات getWorkInfo أو من خلال الاحتفاظ برقم التعريف يدويًا من WorkRequest للاسترجاع لاحقًا باستخدام الملكية العامة WorkRequest.id قبل إضافته إلى قائمة الانتظار
  2. إنشاء طلب عمل جديد: إنشاء WorkRequest جديد واستخدامه WorkRequest.Builder.setID() لضبط رقم تعريفه بحيث يتطابق مع رقم التعريف الحالي WorkRequest
  3. ضبط قيود: استخدِم "WorkRequest.Builder.setConstraints()" لاجتياز قيود جديدة في WorkManager.
  4. طلب تحديث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، يُرجى اتّباع الخطوات التالية:

  1. WorkInfo: يجب الاتصال بـ WorkManager.getWorkInfoById() لاسترداد أحد المثيلات. من WorkInfo بما يتوافق مع WorkRequest.
    • يمكنك استدعاء إحدى الطرق العديدة التي تعرض WorkInfo. لمزيد من المعلومات، معلومات، يُرجى الاطِّلاع على مرجع WorkManager.
  2. 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()