पहले से कतारबद्ध काम को अपडेट करें

पहले से काम करने के बाद, WorkManager आपको WorkRequest को अपडेट करने की अनुमति देता है उसे कतार में लगाया. यह उन बड़े ऐप्लिकेशन में अक्सर ज़रूरी होता है जिनमें अक्सर बदलाव होते रहते हैं कंस्ट्रेंट या अपने कर्मचारियों को तुरंत अपडेट करना. WorkManager के तौर पर के वर्शन 2.8.0 में, updateWork() एपीआई की मदद से ऐसा किया जा सकता है.

updateWork() तरीके की मदद से, WorkRequest को तुरंत, मैन्युअल तरीके से प्रोसेस किए बिना नए यूआरएल को रद्द करने और उसकी सूची बनाने के लिए किया जा सकता है. इससे डेवलपमेंट की प्रोसेस बहुत आसान हो जाती है प्रोसेस.

काम को रद्द करने से बचें

आम तौर पर, आपको मौजूदा WorkRequest को रद्द करने और नई लाइन की सूची बनाने से बचना चाहिए एक. ऐसा करने पर, ऐप्लिकेशन में कुछ टास्क दोहराए जा सकते हैं. साथ ही, आपको ऐसा करने की ज़रूरत पड़ सकती है बड़ी संख्या में अतिरिक्त कोड लिखने के लिए.

नीचे दिए गए उदाहरणों में देखें कि WorkRequest को रद्द करने की वजह क्या हो सकती है कठिनाइयां:

  • बैक-एंड अनुरोध: अगर कंप्यूटिंग के दौरान Worker को रद्द किया जाता है सर्वर पर भेजने के लिए पेलोड, नया Worker फिर से शुरू करना होगा और संभावित रूप से महंगे पेलोड का फिर से हिसाब लगाएं.
  • शेड्यूलिंग: अगर आपने किसी PeriodicWorkRequest को रद्द किया और आपको जैसे कि नए PeriodicWorkRequest को उसी शेड्यूल पर एक्ज़ीक्यूट करना चाहिए, तो आपको समय ऑफ़सेट की गणना करने के लिए ताकि यह पक्का किया जा सके कि नया निष्पादन समय अलाइन है काम करने के पिछले अनुरोध के साथ.

updateWork() एपीआई की मदद से, काम के अनुरोध के कंस्ट्रेंट को अपडेट किया जा सकता है और दूसरे पैरामीटर का इस्तेमाल करने की ज़रूरत नहीं होती.

काम कब रद्द करें

ऐसे मामलों में सीधे तौर पर रद्द करने के बजाय, WorkRequest को रद्द करना चाहिए updateWork() को कॉल करें. जब आपको कन्वर्ज़न विंडो में बदलाव करना हो, तो आपको ऐसा करना चाहिए किस तरह के काम के लिए आपने अनुरोध किया है.

ऑफ़िस का पता कब अपडेट करें

ज़रा सोचो कि कोई ऐसा फ़ोटो ऐप्लिकेशन है जो उपयोगकर्ता की फ़ोटो का हर दिन बैकअप लेता है. इसमें हैं ऐसा करने के लिए PeriodicWorkRequest कतार में लगा. WorkRequest में कुछ सीमाएं हैं जिनके लिए डिवाइस का चार्ज होना और वाई-फ़ाई से कनेक्ट होना ज़रूरी है.

हालांकि, उपयोगकर्ता अपने डिवाइस को रोज़ाना सिर्फ़ 20 मिनट के लिए ही चार्ज करता है. शामिल करें. ऐसे में, ऐप्लिकेशन WorkRequest को अपडेट कर सकता है, ताकि चार्जिंग बाधित होती है, जिससे यह अब भी फ़ोटो अपलोड कर सकता है, भले ही डिवाइस वह पूरी तरह से चार्ज नहीं होता.

ऐसी स्थिति में, काम को अपडेट करने के लिए updateWork() तरीके का इस्तेमाल किया जा सकता है तय करें.

ऑफ़िस का पता अपडेट करने का तरीका

updateWork() का इस्तेमाल करके, मौजूदा रिपोर्ट को आसानी से अपडेट किया जा सकता है WorkRequest को सदस्यता रद्द करने और नए कोड को इंक्यू करने की ज़रूरत नहीं है.

पंक्ति में जोड़े गए अपडेट को इस्तेमाल करने के लिए, यह तरीका अपनाएं:

  1. सूची में जोड़े गए काम का मौजूदा आईडी पाना: अपने WorkRequest का आईडी पाएं को अपडेट करना है. इस आईडी को इनमें से किसी भी तरीके से वापस पाया जा सकता है getWorkInfo एपीआई या शुरुआती आईडी से मैन्युअल तरीके से आईडी को सेव करके सार्वजनिक प्रॉपर्टी की मदद से बाद में डेटा वापस पाने के लिए WorkRequest WorkRequest.id को सूची में जोड़ने से पहले
  2. नया WorkRequest बनाएं: नया WorkRequest बनाएं और इसका इस्तेमाल करें WorkRequest.Builder.setID() का आईडी सेट करें, ताकि वह मौजूदा आईडी से मेल खाए WorkRequest.
  3. सीमाएं सेट करें: पास करने के लिए WorkRequest.Builder.setConstraints() का इस्तेमाल करें WorkManager नए कंस्ट्रेंट.
  4. updateWork को कॉल करें: updateWork() को नया WorkRequest भेजें.

वर्क प्रोफ़ाइल का उदाहरण अपडेट करें

यहां Kotlin में कोड स्निपेट का एक उदाहरण दिया गया है, जो बताता है कि इस्तेमाल किए गए WorkRequest की बैटरी की क्षमता को बदलने का updateWork() तरीका फ़ोटो अपलोड करने के लिए:

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() को कॉल करें आपके WorkRequest से संबंधित WorkInfo का.
    • 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()

काम की जानकारी अपडेट करने से जुड़ी नीतियां

पहले, समय-समय पर होने वाले काम को अपडेट करने के लिए, ExistingPeriodicWorkPolicy.REPLACE नीति के साथ PeriodicWorkRequest. अगर उसी यूनीक id के साथ कोई PeriodicWorkRequest बाकी था, तो नई काम से जुड़ा अनुरोध रद्द हो जाएगा और मिट जाएगा. अब यहां इस नीति को इस्तेमाल नहीं किया जा सकता का सुझाव दें. इसके लिए, ExistingPeriodicWorkPolicy.UPDATE का इस्तेमाल करें.

उदाहरण के लिए, enqueueUniquePeriodicWork का इस्तेमाल, PeriodicWorkRequest, नए PeriodicWorkRequest को शुरू करने के लिए, ExistingPeriodicWorkPolicy.UPDATE नीति. अगर कोई अनुरोध स्वीकार किया जाना बाकी है PeriodicWorkRequest में उसी यूनीक नाम का इस्तेमाल करके, WorkManager इसे नई विशेषताएं. इस वर्कफ़्लो के बाद, इसका इस्तेमाल करने की ज़रूरत नहीं है updateWork().