तय करने के बाद,
Worker
और
आपके WorkRequest
,
आखिरी कदम है अपने काम की लाइन में लगाना. काम के लिए कतार में लगाने का सबसे आसान तरीका
WorkManager enqueue()
तरीके को कॉल करने के लिए, WorkRequest
को पास किया जा रहा है
दौड़ना चाहते हैं.
Kotlin
val myWork: WorkRequest = // ... OneTime or PeriodicWork WorkManager.getInstance(requireContext()).enqueue(myWork)
Java
WorkRequest myWork = // ... OneTime or PeriodicWork WorkManager.getInstance(requireContext()).enqueue(myWork);
डुप्लीकेट एंट्री से बचने के लिए, काम की सूची बनाते समय सावधानी बरतें. उदाहरण के लिए, कोई ऐप्लिकेशन अपलोड करने की कोशिश कर सकता है यह हर 24 घंटे में बैकएंड सेवा में लॉग करता है. अगर आप सावधान नहीं हैं, तो एक ही टास्क को कई बार कतार में लगाना पड़ता है. भले ही, उस काम के लिए सिर्फ़ एक बार चलाया जाए. इस लक्ष्य को पाने के लिए, काम को यूनीक वर्क के तौर पर शेड्यूल किया जा सकता है.
अनोखा काम
यूनीक कॉन्टेंट एक बेहतरीन कॉन्सेप्ट है, जो इस बात की गारंटी देता है कि आपके पास सिर्फ़ एक एक बार में किसी खास नाम के साथ काम करने की संख्या. आईडी से अलग, यूनीक नाम कोड ऐसे हों जिन्हें इंसान पढ़ सकें और अपने-आप जनरेट होने के बजाय डेवलपर ने इनके बारे में बताया हो WorkManager की ओर से. नापसंद करें टैग, यूनीक नाम सिर्फ़ एक काम से जुड़े होते हैं.
यूनीक काम को एक बार के होने वाले और समय-समय पर किए जाने वाले, दोनों तरह के काम के लिए लागू किया जा सकता है. आपके पास इनमें से किसी एक तरीके को लागू करके, एक खास काम का क्रम तय करें. यह काम इस बात पर निर्भर करेगा कि बार-बार होने वाले काम या एक बार वाले काम को शेड्यूल किया जा रहा है.
- एक बार के काम के लिए
WorkManager.enqueueUniqueWork()
- समय-समय पर किए जाने वाले काम के लिए
WorkManager.enqueueUniquePeriodicWork()
इन दोनों तरीकों में तीन आर्ग्युमेंट स्वीकार किए जाते हैं:
- uniqueWorkName -
String
का इस्तेमाल, किसी वीडियो की खास तरह से पहचान करने के लिए किया जाता है अनुरोध. - existingWorkPolicy -
enum
, जो WorkManager को यह बताता है कि उसे क्या करना है अगर उस खास नाम से पहले से ही कोई अधूरा काम है. यहां जाएं: विवाद समाधान की नीति पढ़ें. - work - शेड्यूल करने के लिए
WorkRequest
.
यूनीक काम की मदद से, हम डुप्लीकेट शेड्यूल की समस्या को हल कर सकते हैं, जो पहले बताई गई थी.
Kotlin
val sendLogsWorkRequest = PeriodicWorkRequestBuilder<SendLogsWorker>(24, TimeUnit.HOURS) .setConstraints(Constraints.Builder() .setRequiresCharging(true) .build() ) .build() WorkManager.getInstance(this).enqueueUniquePeriodicWork( "sendLogs", ExistingPeriodicWorkPolicy.KEEP, sendLogsWorkRequest )
Java
PeriodicWorkRequest sendLogsWorkRequest = new PeriodicWorkRequest.Builder(SendLogsWorker.class, 24, TimeUnit.HOURS) .setConstraints(new Constraints.Builder() .setRequiresCharging(true) .build() ) .build(); WorkManager.getInstance(this).enqueueUniquePeriodicWork( "sendLogs", ExistingPeriodicWorkPolicy.KEEP, sendLogsWorkRequest);
अब, अगर sendLogs जॉब पहले से ही सूची में मौजूद है और कोड चलता है, तो मौजूदा नौकरी के विकल्प को बनाए रखा जाता है और कोई नई नौकरी नहीं जोड़ी जाती.
काम के यूनीक क्रम तब भी मददगार हो सकते हैं, जब आपको धीरे-धीरे लंबी चेन में काम करने की सुविधा मिलती है. उदाहरण के लिए, फ़ोटो एडिटिंग ऐप्लिकेशन की मदद से उपयोगकर्ता, गतिविधियों की लंबी चेन. पहले जैसा करने वाली हर कार्रवाई में थोड़ा समय लग सकता है, लेकिन उन्हें सही क्रम में परफ़ॉर्म करना चाहिए. इस मामले में, ऐप्लिकेशन ये काम कर सकता था: एक "पहले जैसा करें" पहले जैसा करने की हर कार्रवाई को चेन में जोड़ें और ज़रूरत के हिसाब से जोड़ें. चाइनिंग का काम देखें देखें.
समस्या को हल करने के लिए बनी नीति
यूनीक काम को शेड्यूल करते समय, आपको WorkManager को बताना होगा कि कब क्या करना है में टकराव होता है. इसके लिए, काम की सूची बनाते समय एक एनम पास किया जाता है.
एक बार के काम के लिए, आप
ExistingWorkPolicy
, जो
संघर्ष के समाधान के लिए 4 विकल्पों का समर्थन करता है.
REPLACE
मौजूदा नए काम के साथ काम करते हैं. इस विकल्प से मौजूदा काम रद्द हो जाता है.KEEP
मौजूदा काम और उसे अनदेखा कर दें.APPEND
नया वीडियो काम खत्म हो जाएगा. इस नीति से आपका नया काम जुड़ी मौजूदा काम के खत्म होने के बाद चलाया जाएगा.
मौजूदा काम, नए काम के लिए ज़रूरी शर्त बन जाता है. अगर मौजूदा काम
हो जाता है CANCELLED
या FAILED
हो जाता है, नया काम भी CANCELLED
या FAILED
हो जाता है.
अगर आपको मौजूदा काम की स्थिति पर ध्यान दिए बिना नया काम चलाना है, तो
इसके बजाय, APPEND_OR_REPLACE
का इस्तेमाल करें.
APPEND_OR_REPLACE
APPEND
की तरह ही फ़ंक्शन करता है, अंतर सिर्फ़ इतना होता है कि यह इस पर निर्भर नहीं है: काम की स्थिति ज़रूरी शर्त. अगर मौजूदा कामCANCELLED
याFAILED
, नया काम अब भी चल रहा है.
अवधि के काम के लिए, आप एक
ExistingPeriodicWorkPolicy
जो दो विकल्प, REPLACE
और KEEP
के साथ काम करता है. ये विकल्प एक जैसे काम करते हैं
के लिए उपलब्ध हैं.
आपके काम पर नज़र रखी जा रही है
काम की सूची बनाने के बाद किसी भी समय, क्वेरी करके इसकी स्थिति देखी जा सकती है
WorkManager को name
, id
या उससे जुड़े tag
के ज़रिए.
Kotlin
// by id workManager.getWorkInfoById(syncWorker.id) // ListenableFuture<WorkInfo> // by name workManager.getWorkInfosForUniqueWork("sync") // ListenableFuture<List<WorkInfo>> // by tag workManager.getWorkInfosByTag("syncTag") // ListenableFuture<List<WorkInfo>>
Java
// by id workManager.getWorkInfoById(syncWorker.id); // ListenableFuture<WorkInfo> // by name workManager.getWorkInfosForUniqueWork("sync"); // ListenableFuture<List<WorkInfo>> // by tag workManager.getWorkInfosByTag("syncTag"); // ListenableFuture<List<WorkInfo>>
क्वेरी से नतीजे के रूप में
ListenableFuture
एक WorkInfo
ऑब्जेक्ट का होता है, जिसमें यह शामिल होता है
id
काम का, उसके टैग, इसके
मौजूदा State
और कोई भी आउटपुट डेटा
इसके ज़रिए सेट करो
Result.success(outputData)
.
हर एक वैरिएंट का एक LiveData
वैरिएंट
तरीकों से आपको रजिस्टर करके WorkInfo
में हुए बदलावों का पता लगाने की सुविधा मिलती है
एक श्रोता का. उदाहरण के लिए, अगर आपको उपयोगकर्ता को कोई मैसेज तब दिखाना है,
कुछ काम सफलतापूर्वक खत्म हो जाते हैं, तो आप उसे इस तरह से सेट अप कर सकते हैं:
Kotlin
workManager.getWorkInfoByIdLiveData(syncWorker.id) .observe(viewLifecycleOwner) { workInfo -> if(workInfo?.state == WorkInfo.State.SUCCEEDED) { Snackbar.make(requireView(), R.string.work_completed, Snackbar.LENGTH_SHORT) .show() } }
Java
workManager.getWorkInfoByIdLiveData(syncWorker.id) .observe(getViewLifecycleOwner(), workInfo -> { if (workInfo.getState() != null && workInfo.getState() == WorkInfo.State.SUCCEEDED) { Snackbar.make(requireView(), R.string.work_completed, Snackbar.LENGTH_SHORT) .show(); } });
वर्क प्रोफ़ाइल से जुड़ी जटिल क्वेरी
WorkManager 2.4.0 और उसके बाद के वर्शन का इस्तेमाल करके, सूची में शामिल जॉब के लिए मुश्किल क्वेरी करने की सुविधा का इस्तेमाल किया जा सकता है
WorkQuery
ऑब्जेक्ट. WorkQuery सहायता करता है
टैग, स्थिति, और काम के यूनीक नाम के कॉम्बिनेशन की मदद से, काम के लिए क्वेरी करना.
नीचे दिए गए उदाहरण में, “syncTag” टैग के साथ सभी काम ढूंढने का तरीका बताया गया है,
जो FAILED
या CANCELLED
की स्थिति में हो और उसका काम करने का कोई खास नाम हो
या तो “preप्रोसेस” या “sync” हो.
Kotlin
val workQuery = WorkQuery.Builder .fromTags(listOf("syncTag")) .addStates(listOf(WorkInfo.State.FAILED, WorkInfo.State.CANCELLED)) .addUniqueWorkNames(listOf("preProcess", "sync") ) .build() val workInfos: ListenableFuture<List<WorkInfo>> = workManager.getWorkInfos(workQuery)
Java
WorkQuery workQuery = WorkQuery.Builder .fromTags(Arrays.asList("syncTag")) .addStates(Arrays.asList(WorkInfo.State.FAILED, WorkInfo.State.CANCELLED)) .addUniqueWorkNames(Arrays.asList("preProcess", "sync") ) .build(); ListenableFuture<List<WorkInfo>> workInfos = workManager.getWorkInfos(workQuery);
WorkQuery
में हर कॉम्पोनेंट (टैग, स्थिति या नाम) को AND
से जोड़ा जाता है. इसमें
अन्य. कॉम्पोनेंट में मौजूद हर वैल्यू, OR
से जुड़ी होती है. उदाहरण के लिए: (name1 OR name2
OR ...) AND (tag1 OR tag2 OR ...) AND (state1 OR state2 OR ...)
.
WorkQuery
, LiveData के साथ भी काम करता है,
getWorkInfosLiveData()
.
काम को रद्द करना और रोकना
अगर अब आपको सूची में पहले से जोड़े गए काम को चलाने की ज़रूरत नहीं है, तो इसके लिए अनुरोध किया जा सकता है
रद्द करना होगा. काम को उसके name
, id
या tag
के ज़रिए रद्द किया जा सकता है
से जुड़ी हुई हैं.
Kotlin
// by id workManager.cancelWorkById(syncWorker.id) // by name workManager.cancelUniqueWork("sync") // by tag workManager.cancelAllWorkByTag("syncTag")
Java
// by id workManager.cancelWorkById(syncWorker.id); // by name workManager.cancelUniqueWork("sync"); // by tag workManager.cancelAllWorkByTag("syncTag");
हुड के तहत, WorkManager
State
काम. अगर काम
खत्म हो चुके हैं,
कुछ नहीं होता. अन्यथा, काम की स्थिति बदलकर यह हो जाएगी
CANCELLED
और अन्य कॉन्टेंट
भविष्य में नहीं चलेगा. कोई भी
डिपेंडेंट होने वाली WorkRequest
नौकरियां
करने के लिए किया जा सकता है.
साथ ही, CANCELLED
.
फ़िलहाल, RUNNING
ऑफ़िस है
CANNOT TRANSLATE
ListenableWorker.onStopped()
.
किसी भी संभावित क्लीनअप को मैनेज करने के लिए, इस तरीके को बदलें. रोकें
'दौड़ने के लिए स्टाफ़' को जोड़ना.
किसी मौजूदा वर्कर को बंद करना
WorkManager, Worker
के चलने के दौरान इन वजहों से रुक सकता है:
- आपने इसे रद्द करने के लिए (कॉल करके) साफ़ तौर पर कहा है
उदाहरण के लिए,
WorkManager.cancelWorkById(UUID)
). - यूनीक काम के मामले में,
आपने साफ़ तौर पर नया
WorkRequest
में सेExistingWorkPolicy
REPLACE
. पुरानेWorkRequest
को तुरंत रद्द कर दिया गया. - आपके काम की शर्तें अब पूरी नहीं हो रही हैं.
- सिस्टम ने आपके ऐप्लिकेशन को किसी वजह से आपका काम बंद करने का निर्देश दिया है. यह काम कर सकता है ऐसा तब होता है, जब प्रोग्राम को लागू करने की तय समयसीमा 10 मिनट से ज़्यादा हो जाती है. यह काम है बाद में फिर से कोशिश करने के लिए शेड्यूल किया गया है.
इन स्थितियों में, आपका वर्कर रुक गया है.
आपको अपना मौजूदा काम रद्द कर देना चाहिए. साथ ही, वे संसाधन, जो आपके कर्मचारी के पास हैं. उदाहरण के लिए, आपको ब्राउज़र विंडो को बंद करके डेटाबेस और फ़ाइलों को हैंडल करता है. आपके पास दो तरीके हैं जिससे यह समझा जा सके कि आपका कर्मचारी कब रुक रहा है.
onSTOP() कॉलबैक
WorkManager शुरू करता है
ListenableWorker.onStopped()
जैसे ही आपके वर्कर को रोका गया. बंद करने के लिए इस तरीके को बदलें
प्रोसेस करने के लिए इस्तेमाल किया जा सकता है.
isStop() प्रॉपर्टी
आप
आपके वर्कर को पहले ही रोका गया है या नहीं, यह देखने के लिए ListenableWorker.isStopped()
तरीका. अगर आप:
अगर आप अपने वर्कर में लंबे समय तक चलने वाले या बार-बार होने वाले काम करते हैं, तो आपको
बार-बार इस प्रॉपर्टी की जांच करें और काम को जल्द से जल्द रोकने के लिए, इसका इस्तेमाल सिग्नल के तौर पर करें
किया जा सकता है.
ध्यान दें: WorkManager
Result
को किसी कर्मचारी ने सेट किया
जिसे onStop सिग्नल मिला है, क्योंकि वर्कर को पहले से ही
रोक दिया गया है.