GCMNetworkManager থেকে WorkManager-এ স্থানান্তরিত হচ্ছে

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

WorkManager-এ মাইগ্রেট করুন

যদি আপনার অ্যাপ বর্তমানে ব্যাকগ্রাউন্ড অপারেশন করতে GCMNetworkManager ব্যবহার করে, তাহলে WorkManager-এ মাইগ্রেট করতে এই ধাপগুলি অনুসরণ করুন।

নিম্নলিখিত ধাপগুলির জন্য, আমরা ধরে নিচ্ছি আপনি নিম্নলিখিত GCMNetworkManager কোড দিয়ে শুরু করছেন, যা আপনার কাজকে সংজ্ঞায়িত করে এবং সময়সূচী করে:

কোটলিন

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 প্রকৃত আপলোড অপারেশন সংজ্ঞায়িত করে:

কোটলিন

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

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

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

শ্রমিকের সংজ্ঞা দাও

আপনার GCMNetworkManager বাস্তবায়ন একটি OneoffTask বা RecurringTask সংজ্ঞায়িত করে, যা ঠিক কোন কাজটি করতে হবে তা নির্দিষ্ট করে। আপনার কাজের অনুরোধের সংজ্ঞায় নথিভুক্ত হিসাবে আপনাকে একজন Worker হিসাবে এটি পুনরায় লিখতে হবে।

নমুনা GCMNetworkManager কোড একটি myTask টাস্ক সংজ্ঞায়িত করে। WorkManager সমতুল্য এই মত দেখায়:

কোটলিন

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-এর সাথে সারিবদ্ধ করি।

কোটলিন

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 সীমাবদ্ধতা আছে। এই বিভাগে ঐ সমতুল্য তালিকা.

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

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

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

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

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

ট্যাগ

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

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

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

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