GCMNetworkManager থেকে WorkManager-এ মাইগ্রেট করা

GCMNetworkManager লাইব্রেরির পরিবর্তে ব্যাকগ্রাউন্ড অপারেশন পারফর্ম করার জন্য WorkManager ক্লায়েন্ট লাইব্রেরি ব্যবহার করতে কীভাবে অ্যাপ মাইগ্রেট করতে হয় তা এই ডকুমেন্ট ব্যাখ্যা করে। ব্যাকগ্রাউন্ডে কাজ শিডিউল করার জন্য অ্যাপের ক্ষেত্রে WorkManager ব্যবহার করা হল সবচেয়ে ভালো উপায়। এছাড়াও, WorkManager GCM লাইব্রেরি অন্তর্ভুক্ত করার মাধ্যমে, আপনি API লেভেল ২২ বা তার কম ভার্সনের Android ডিভাইসে টাস্ক শিডিউল করার জন্য GCM ব্যবহার করতে WorkManager-কে অনুমতি দিতে পারেন।

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)

জাভা

// 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
    }
}

জাভা

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 লেভেল ২২ বা তার কম ভার্সনে রান করা ডিভাইস)। লাইব্রেরি যোগ করার ব্যাপারে সম্পূর্ণ বিবরণ পেতে, WorkManager-এর সাথে শুরু করা দেখুন।

আপনার ম্যানিফেস্ট পরিবর্তন করুন

আপনি GCMNetworkManager প্রয়োগ করার সময়, GcmNetworkManager রেফারেন্স ডকুমেন্টেশনে যেভাবে বর্ণনা করা হয়েছে সেই অনুযায়ী আপনার অ্যাপ ম্যানিফেস্টে GcmTaskService-এর একটি ইনস্ট্যান্স যোগ করেছেন। GcmTaskService ইনকামিং টাস্ক দেখে এবং টাস্ক হ্যান্ডলারকে এটি ডেলিগেট করে। WorkManager আপনার Worker-এর কাছে টাস্ক ডেলিগেশন ম্যানেজ করে, তাই এটি করে এমন কোনও ক্লাস আপনার আর প্রয়োজন নেই; ম্যানিফেস্ট থেকে আপনার GcmTaskService সরিয়ে দিন।

কর্মী নির্ধারণ করুন

আপনার GCMNetworkManager ইমপ্লিমেন্টেশন OneoffTask বা RecurringTask নির্ধারণ করে, যা ঠিক কী কাজ করতে হবে তা নির্দিষ্ট করে। আপনাকে এটি Worker হিসেবে আবার লিখতে হবে, যেমন আপনার কাজের অনুরোধ সংজ্ঞায়িত করা-তে ডকুমেন্ট করা আছে।

স্যাম্পেল GCMNetworkManager code 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()
    }
}

জাভা

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)

জাভা

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);

API ম্যাপিং

এই বিভাগে কিছু GCMNetworkManager ফিচার ও সীমাবদ্ধতা কীভাবে WorkManager-এর সমতুল্য হিসেবে ম্যাপ করা হয় তা বর্ণনা করা হয়েছে।

কনস্ট্রেন্ট ম্যাপিং

GCMNetworkManager আপনাকে টাস্ক কখন রান করা উচিত সেই বিষয়ে একাধিক সীমাবদ্ধতা সেট করতে দেয়। বেশিরভাগ ক্ষেত্রে, একটি স্পষ্ট সমতুল্য WorkManager সীমাবদ্ধতা রয়েছে। এই বিভাগে সেইসব সমতুল্য শব্দ তালিকাভুক্ত করা হয়েছে।

টাস্কের Builder অবজেক্টে উপযুক্ত পদ্ধতি কল করে GCMNetworkManager টাস্কে সীমাবদ্ধতা সেট করুন; যেমন, আপনি Task.Builder.setRequiredNetwork() কল করে নেটওয়ার্ক সংক্রান্ত প্রয়োজনীয়তা সেট করতে পারবেন।

WorkManager-এ, আপনি একটি Constraints.Builder অবজেক্ট তৈরি করেন এবং কনস্ট্রেন্ট সেট করতে সেই অবজেক্টের মেথড কল করেন (যেমন, Constraints.Builder.setRequiredNetworkType()), তারপর একটি কনস্ট্রেন্ট অবজেক্ট তৈরি করতে Builder ব্যবহার করেন যা আপনি কাজের অনুরোধের সাথে অ্যাটাচ করতে পারেন। আরও তথ্যের জন্য, আপনার কাজের অনুরোধ সংজ্ঞায়িত করা দেখুন।

GCMNetworkManager সংক্রান্ত সমস্যা WorkManager-এর সমতুল্য নোট
setPersisted() (প্রয়োজন নেই) ডিভাইস রিবুট করার পরেও সব WorkManager জব থেকে যায়
setRequiredNetwork() setRequiredNetworkType() ডিফল্ট হিসেবে GCMNetworkManager-এর নেটওয়ার্ক অ্যাক্সেস প্রয়োজন। WorkManager-এর জন্য ডিফল্ট হিসেবে নেটওয়ার্ক অ্যাক্সেসের প্রয়োজন হয় না। আপনার কাজের জন্য নেটওয়ার্ক অ্যাক্সেস প্রয়োজন হলে, আপনাকে অবশ্যই setRequiredNetworkType(CONNECTED) ব্যবহার করতে হবে অথবা আরও নির্দিষ্ট কিছু নেটওয়ার্কের ধরন সেট করতে হবে।
setRequiresCharging()

অন্যান্য ম্যাপিং

সীমাবদ্ধতা ছাড়াও, GCMNetworkManager টাস্কে আপনি অন্যান্য সেটিংসও প্রয়োগ করতে পারবেন। এই বিভাগে WorkManager জবে সেইসব সেটিংস প্রয়োগ করার জন্য সংশ্লিষ্ট পদ্ধতি তালিকাভুক্ত করা হয়েছে।

ট্যাগ

সব GCMNetworkManager টাস্কে অবশ্যই একটি ট্যাগ স্ট্রিং থাকতে হবে, যা আপনি Builder-এর setTag() মেথড কল করে সেট করেন। WorkManager-এর কাজগুলি একটি আইডি দ্বারা অনন্যভাবে শনাক্ত করা হয়, যা WorkManager দ্বারা অটোমেটিক তৈরি হয়; আপনি WorkRequest.getId() কল করে সেই আইডি পেতে পারেন। এছাড়াও, কাজের অনুরোধে বিকল্প হিসেবে এক বা একাধিক ট্যাগ থাকতে পারে। আপনার WorkManager জবের জন্য ট্যাগ সেট করতে, WorkRequest তৈরি করার জন্য সেই বিল্ডার ব্যবহার করার আগে, WorkRequest.Builder.addTag() মেথড কল করুন।

GCMNetworkManager-এ, আপনি setUpdateCurrent() কল করতে পারেন যাতে টাস্কটি একই ট্যাগ সহ কোনও বিদ্যমান টাস্ক প্রতিস্থাপন করবে কিনা তা নির্দিষ্ট করা যায়। WorkManager-এর সমতুল্য পদ্ধতি হল enqueueUniqueWork() বা enqueueUniquePeriodicWork() কল করে টাস্কটি সারিবদ্ধ করা; আপনি যদি এই পদ্ধতিগুলি ব্যবহার করেন, তাহলে আপনি কাজটিকে একটি অনন্য নাম দেন এবং সেই নামে আগে থেকেই কোনও মুলতুবি কাজ থাকলে WorkManager কীভাবে অনুরোধটি পরিচালনা করবে তাও নির্দিষ্ট করেন। আরও তথ্যের জন্য, অনন্য কাজ ম্যানেজ করা দেখুন।

টাস্ক প্যারামিটার

আপনি Task.Builder.setExtras() কল করে এবং প্যারামিটার সহ Bundle পাস করে GCMNetworkManager জবে প্যারামিটার পাস করতে পারেন। WorkManager আপনাকে WorkManager জবে একটি Data অবজেক্ট পাস করার অনুমতি দেয়, যাতে কী/ভ্যালু পেয়ার হিসেবে প্যারামিটার থাকে। আরও জানতে, ইনপুট ডেটা অ্যাসাইন করুন দেখুন।