GCMNetworkManager से WorkManager पर माइग्रेट करना

इस दस्तावेज़ में, WorkManager क्लाइंट लाइब्रेरी का इस्तेमाल करने के लिए ऐप्लिकेशन माइग्रेट करने का तरीका बताया गया है इस्तेमाल करें. कॉन्टेंट बनाने बैकग्राउंड जॉब शेड्यूल करने के लिए, ऐप्लिकेशन का पसंदीदा तरीका WorkManager का इस्तेमाल करना है. इन्होंने बदलाव किया है साथ ही, WorkManager GCM लाइब्रेरी को भी शामिल करके, WorkManager को चालू किया जा सकता है. एपीआई लेवल 22 वाले Android डिवाइसों पर चलाने के दौरान, टास्क शेड्यूल करने के लिए GCM का इस्तेमाल करें या उससे कम.

WorkManager पर माइग्रेट करें

अगर आपका ऐप्लिकेशन फ़िलहाल बैकग्राउंड में काम करने के लिए GCMNetworkManager का इस्तेमाल कर रहा है, तो WorkManager पर माइग्रेट करने के लिए, यह तरीका अपनाएं.

नीचे दिए गए चरणों के लिए, हम मान लेते हैं कि आप इन निर्देशों से शुरुआत कर रहे हैं GCMNetworkManager कोड, जो आपके टास्क के बारे में बताता है और उसे शेड्यूल करता है:

Kotlin

val myTask = OneoffTask.Builder()
    // setService() says what class does the work
    .setService(MyUploadService::class.java)
    // Don't run the task unless device is charging
    .setRequiresCharging(true)
    // Run the task between 5 & 15 minutes from now
    .setExecutionWindow(5 * DateUtil.MINUTE_IN_SECONDS,
            15 * DateUtil.MINUTE_IN_SECONDS)
    // Define a unique tag for the task
    .setTag("test-upload")
    // ...finally, build the task and assign its value to myTask
    .build()
GcmNetworkManager.getInstance(this).schedule(myTask)

Java

// In GcmNetworkManager, this call defines the task and its
// runtime constraints:
OneoffTask myTask = new OneoffTask.Builder()
    // setService() says what class does the work
    .setService(MyUploadService.class)
    // Don't run the task unless device is charging
    .setRequiresCharging(true)
    // Run the task between 5 & 15 minutes from now
    .setExecutionWindow(
        5 * DateUtil.MINUTE_IN_SECONDS,
        15 * DateUtil.MINUTE_IN_SECONDS)
    // Define a unique tag for the task
    .setTag("test-upload")
    // ...finally, build the task and assign its value to myTask
    .build();
GcmNetworkManager.getInstance(this).schedule(myTask);

इस उदाहरण में, हम मानते हैं कि MyUploadService असल में अपलोड की कार्रवाई के बारे में बताता है:

Kotlin

class MyUploadService : GcmTaskService() {
    fun onRunTask(params: TaskParams): Int {
        // Do some upload work
        return GcmNetworkManager.RESULT_SUCCESS
    }
}

Java

class MyUploadService extends GcmTaskService {
    @Override
    public int onRunTask(TaskParams params) {
        // Do some upload work
        return GcmNetworkManager.RESULT_SUCCESS;
    }
}

WorkManager लाइब्रेरी को शामिल करना

WorkManager क्लास का इस्तेमाल करने के लिए, आपको WorkManager लाइब्रेरी को अपने डिपेंडेंसी बनाना. आपको WorkManager GCM लाइब्रेरी भी जोड़नी होगी, जब आपका ऐप्लिकेशन चालू हो, तब WorkManager को जॉब शेड्यूल करने के लिए GCM का इस्तेमाल करने की सुविधा देता है ऐसे डिवाइस जो JobScheduler पर काम नहीं करते (इसका मतलब है कि वे डिवाइस जो API लेवल 22 पर काम करते हैं या उससे कम). लाइब्रेरी जोड़ने के बारे में पूरी जानकारी के लिए, WorkManager.

अपने मेनिफ़ेस्ट में बदलाव करें

GCMNetworkManager को लागू करने पर, आपने आपके ऐप्लिकेशन मेनिफ़ेस्ट के लिए GcmTaskService, जैसा कि GcmNetworkManager में बताया गया है रेफ़रंस के लिए दस्तावेज़. GcmTaskService आने वाले टास्क को देखता है और उसे टास्क में सौंप देता है हैंडलर. WorkManager आपके वर्कर को टास्क का ऐक्सेस मैनेज करता है, ताकि आपको ऐसा करने वाली क्लास की ज़रूरत होगी; बस अपना GcmTaskService मेनिफ़ेस्ट.

वर्कर के बारे में बताना

आपके GCMNetworkManager को लागू करने पर, OneoffTask या RecurringTask के बारे में पता चलता है, जो यह बताता है कि क्या काम किया जाना है. आपको फिर से लिखना होगा कि Worker, जैसा कि आपके काम को तय करना अनुरोध.

GCMNetworkManager का सैंपल कोड myTask टास्क के बारे में बताता है. WorkManager इससे मिलता-जुलता कुछ ऐसा दिखता है:

Kotlin

class UploadWorker(context: Context, params: WorkerParameters)
                        : Worker(context, params) {
    override fun doWork() : Result {
        // Do the upload operation ...
        myUploadOperation()

        // Indicate whether the task finished successfully with the Result
        return Result.success()
    }
}

Java

public class UploadWorker extends Worker {

    public UploadWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
        super(context, params);
    }

    @Override
    public Result doWork() {
      // Do the upload operation ...

      myUploadOperation()

      // Indicate whether the task finished successfully with the Result
      return Result.success()
    }
}

GCM टास्क और Worker के बीच कुछ अंतर होते हैं:

  • GCM टास्क में पैरामीटर पास करने के लिए TaskParams ऑब्जेक्ट का इस्तेमाल करता है. कॉन्टेंट बनाने WorkManager इनपुट डेटा का इस्तेमाल करता है, जिसे WorkRequest पर इस तरह तय किया जा सकता है इसके लिए इनपुट/आउटपुट तय करने के बारे में, WorkManager दस्तावेज़ में बताया गया है आपका टास्क चुनें. दोनों मामलों में, किसी भी स्थायी जोड़े जाने लायक कुंजी/वैल्यू पेयर को पास किया जा सकता है पैरामीटर की ज़रूरत होती है.
  • GcmTaskService, इस तरह के फ़्लैग लौटाकर सफलता या असफलता का संकेत देता है GcmNetworkManager.RESULT_SUCCESS. WorkManager Worker अपने नतीजों को सिग्नल देता है और पासवर्ड का इस्तेमाल करके ListenableWorker.Result तरीका, पसंद ListenableWorker.Result.success(), और उस तरीके की रिटर्न वैल्यू दे सकता है.
  • जैसा कि हमने बताया है, आप Worker; इसके बजाय, आप इसे अगले चरण में करते हैं, जब आप WorkRequest.

काम का अनुरोध शेड्यूल करें

Worker तय करने से यह तय होता है कि आपको क्या करना होगा. यह बताने के लिए कि काम कब किया जाना चाहिए, तो आपको WorkRequest:

  1. OneTimeWorkRequest बनाएं या PeriodicWorkRequest और यह तय करने के लिए कि टास्क कब चलना चाहिए, अपनी पसंद के किसी भी कंस्ट्रेंट को सेट करें. टैग का इस्तेमाल करें.
  2. अनुरोध को WorkManager.enqueue() कार्य को निष्पादन के लिए पंक्तिबद्ध करने के लिए.

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

Kotlin

val uploadConstraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true).build()

val uploadTask = OneTimeWorkRequestBuilder<UploadWorker>()
    .setConstraints(uploadConstraints)
    .build()
WorkManager.getInstance().enqueue(uploadTask)

Java

Constraints uploadConstraints = new Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true)
    .build();

OneTimeWorkRequest uploadTask =
        new OneTimeWorkRequest.Builder(UploadWorker.class)
  .setConstraints(uploadConstraints)
  .build();
WorkManager.getInstance().enqueue(uploadTask);

एपीआई मैपिंग

इस सेक्शन में बताया गया है कि GCMNetworkManager की कुछ सुविधाएं और कंस्ट्रेंट मैप कैसे किए जाते हैं WorkManager जैसी कंपनियों के लिए.

कंस्ट्रेंट मैपिंग

GCMNetworkManager आपको कई कंस्ट्रेंट को यह सेट करने की सुविधा देता है कि आपको अपना टास्क कब करना चाहिए दौड़ना. ज़्यादातर मामलों में, WorkManager की सीमा साफ़ तौर पर दिखती है. यह अनुभाग में वे समान राशि दी जाती है.

सही तरीका कॉल करके GCMNetworkManager टास्क पर पाबंदियां सेट करें टास्क का बिल्डर ऑब्जेक्ट; उदाहरण के लिए, नेटवर्क की ज़रूरत को Task.Builder.setRequiredNetwork() को कॉल किया जा रहा है.

WorkManager में, आपको Constraints.Builder ऑब्जेक्ट और उस ऑब्जेक्ट के तरीकों को कॉल करें (उदाहरण के लिए, Constraints.Builder.setRequiredNetworkType()), फिर, एक Constraints ऑब्जेक्ट बनाने के लिए बिल्डर का इस्तेमाल करें, जिसे काम करने के लिए किया जा सकता है. ज़्यादा जानकारी के लिए, अपने काम को तय करना देखें अनुरोध हैं.

GCMNetworkManager कंस्ट्रेंट WorkManager से मिलता-जुलता नोट
setPersisted() (ज़रूरी नहीं) WorkManager के सभी जॉब, डिवाइस को फिर से चालू करने पर लागू होते हैं
setRequiredNetwork() setRequiredNetworkType() डिफ़ॉल्ट रूप से, GCMNetworkManager को नेटवर्क ऐक्सेस की ज़रूरत होती है. WorkManager को डिफ़ॉल्ट रूप से, नेटवर्क के ऐक्सेस की ज़रूरत नहीं होती. अगर आपके जॉब के लिए नेटवर्क का ऐक्सेस चाहिए, तो आपको setRequiredNetworkType(CONNECTED) का इस्तेमाल करना होगा या नेटवर्क का कोई खास टाइप सेट करना होगा.
setRequiresCharging()

अन्य मैपिंग

सीमाओं के अलावा, ऐसी अन्य सेटिंग भी हैं जिन्हें GCMNetworkManager पर लागू किया जा सकता है टास्क. इस सेक्शन में, उन सेटिंग को WorkManager की नौकरी.

टैग

सभी GCMNetworkManager टास्क में एक टैग स्ट्रिंग होनी चाहिए, जिसे आप बिल्डर setTag() तरीका. WorkManager जॉब की पहचान एक आईडी से की जाती है, जो WorkManager से अपने-आप जनरेट होता है; तो आप कॉल करके वह आईडी पा सकते हैं WorkRequest.getId(). तय सीमा में साथ ही, काम के अनुरोधों में एक या उससे ज़्यादा टैग ज़रूरी नहीं हो सकते हैं. टैग सेट करने के लिए अपना WorkManager नौकरी ढूंढने के लिए, WorkRequest.Builder.addTag() तरीके का इस्तेमाल करके WorkRequest बनाने के लिए उस बिल्डर का इस्तेमाल करें.

GCMNetworkManager में, setUpdateCurrent() का इस्तेमाल करें. WorkManager का काम, कॉल करके टास्क को सूची में जोड़ना enqueueUniqueWork() या enqueueUniquePeriodicWork(); अगर इन तरीकों का इस्तेमाल किया जाता है, तो काम को एक अलग नाम दिया जाता है. साथ ही, यह भी तय किया जाता है कि अगर उसके लिए पहले से कोई काम पूरा नहीं हुआ है, तो WorkManager को यह अनुरोध मैनेज करना चाहिए नाम. ज़्यादा जानकारी के लिए, यूनीक हैंडलिंग का तरीका देखें काम करने की जगह.

टास्क के पैरामीटर

आप कॉल करके GCMNetworkManager जॉब में पैरामीटर पास कर सकते हैं Task.Builder.setExtras() और पैरामीटर वाला Bundle पास करना. WorkManager की मदद से WorkManager जॉब के लिए एक Data ऑब्जेक्ट, जिसमें पैरामीटर, कुंजी/वैल्यू के तौर पर मौजूद हैं पेयर. जानकारी के लिए, यह देखें इनपुट डेटा असाइन करें.