पहले से काम करने के बाद, 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
को सदस्यता रद्द करने और नए कोड को इंक्यू करने की ज़रूरत नहीं है.
पंक्ति में जोड़े गए अपडेट को इस्तेमाल करने के लिए, यह तरीका अपनाएं:
- सूची में जोड़े गए काम का मौजूदा आईडी पाना: अपने WorkRequest का आईडी पाएं
को अपडेट करना है. इस आईडी को इनमें से किसी भी तरीके से वापस पाया जा सकता है
getWorkInfo
एपीआई या शुरुआती आईडी से मैन्युअल तरीके से आईडी को सेव करके सार्वजनिक प्रॉपर्टी की मदद से बाद में डेटा वापस पाने के लिए WorkRequestWorkRequest.id
को सूची में जोड़ने से पहले - नया WorkRequest बनाएं: नया
WorkRequest
बनाएं और इसका इस्तेमाल करेंWorkRequest.Builder.setID()
का आईडी सेट करें, ताकि वह मौजूदा आईडी से मेल खाएWorkRequest
. - सीमाएं सेट करें: पास करने के लिए
WorkRequest.Builder.setConstraints()
का इस्तेमाल करें WorkManager नए कंस्ट्रेंट. - 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
जनरेट करने के लिए, यह तरीका अपनाएं:
- WorkInfo: किसी इंस्टेंस को वापस पाने के लिए,
WorkManager.getWorkInfoById()
को कॉल करें आपकेWorkRequest
से संबंधितWorkInfo
का.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()
काम की जानकारी अपडेट करने से जुड़ी नीतियां
पहले, समय-समय पर होने वाले काम को अपडेट करने के लिए,
ExistingPeriodicWorkPolicy.REPLACE
नीति के साथ PeriodicWorkRequest
.
अगर उसी यूनीक id
के साथ कोई PeriodicWorkRequest
बाकी था, तो नई
काम से जुड़ा अनुरोध रद्द हो जाएगा और मिट जाएगा. अब यहां इस नीति को इस्तेमाल नहीं किया जा सकता
का सुझाव दें. इसके लिए, ExistingPeriodicWorkPolicy.UPDATE
का इस्तेमाल करें.
उदाहरण के लिए, enqueueUniquePeriodicWork
का इस्तेमाल,
PeriodicWorkRequest
, नए PeriodicWorkRequest
को शुरू करने के लिए,
ExistingPeriodicWorkPolicy.UPDATE
नीति. अगर कोई अनुरोध स्वीकार किया जाना बाकी है
PeriodicWorkRequest
में उसी यूनीक नाम का इस्तेमाल करके, WorkManager इसे
नई विशेषताएं. इस वर्कफ़्लो के बाद, इसका इस्तेमाल करने की ज़रूरत नहीं है
updateWork()
.