काम मैनेज करना

तय करने के बाद, 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 की ओर से. नापसंद करें टैग, यूनीक नाम सिर्फ़ एक काम से जुड़े होते हैं.

यूनीक काम को एक बार के होने वाले और समय-समय पर किए जाने वाले, दोनों तरह के काम के लिए लागू किया जा सकता है. आपके पास इनमें से किसी एक तरीके को लागू करके, एक खास काम का क्रम तय करें. यह काम इस बात पर निर्भर करेगा कि बार-बार होने वाले काम या एक बार वाले काम को शेड्यूल किया जा रहा है.

इन दोनों तरीकों में तीन आर्ग्युमेंट स्वीकार किए जाते हैं:

  • uniqueWorkName - String का इस्तेमाल, किसी वीडियो की खास तरह से पहचान करने के लिए किया जाता है अनुरोध.
  • existingWorkPolicy - enum, जो WorkManager को यह बताता है कि उसे क्या करना है अगर उस खास नाम से पहले से ही कोई अधूरा काम है. यहां जाएं: विवाद समाधान की नीति पढ़ें.
  • work - शेड्यूल करने के लिए WorkRequest.

यूनीक काम की मदद से, हम डुप्लीकेट शेड्यूल की समस्या को हल कर सकते हैं, जो पहले बताई गई थी.

Kotlin

val sendLogsWorkRequest =
       PeriodicWorkRequestBuilderS<endLogsWorker(>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) // ListenableFutureW<orkInfo<>/span>

// by name
workManager.getWorkInfosForUniqueWork("sync") // ListenableFutureL<istW<orkInfo<>/span>
>
// by tag
workManager.getWorkInfosByTag("syncTag") // ListenableFutureL<istW<orkInfo<>/span>
>

Java

// by id
workManager.getWorkInfoById(syncWorker.id); // ListenableFutureW<orkInfo<>/span>

// by name
workManager.getWorkInfosForUniqueWork("sync"); // ListenableFutureL<istW<orkInfo<>/span>
>
// by tag
workManager.getWorkInfosByTag("syncTag"); // ListenableFutureL<istW<orkInfo<>/span>
>

क्वेरी से नतीजे के रूप में 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: ListenableFutureL<istW<orkInfo >>= 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();

ListenableFutureL<istW<orkInfo >>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 सिग्नल मिला है, क्योंकि वर्कर को पहले से ही रोक दिया गया है.