ইতিমধ্যে সারিবদ্ধ কাজ আপডেট করুন

WorkManager আপনাকে একটি WorkRequest আপডেট করার অনুমতি দেয় আপনি ইতিমধ্যেই সারিবদ্ধ করার পরে। এটি প্রায়শই বড় অ্যাপগুলিতে প্রয়োজনীয় যেগুলি ঘন ঘন সীমাবদ্ধতা পরিবর্তন করে বা তাদের কর্মীদের উড়ন্ত অবস্থায় আপডেট করতে হয়। WorkManager সংস্করণ 2.8.0 অনুযায়ী, updateWork() API হল এটি করার মাধ্যম।

updateWork() পদ্ধতিটি আপনাকে ফ্লাইতে একটি WorkRequest কিছু দিক পরিবর্তন করতে দেয়, ম্যানুয়ালি বাতিল এবং একটি নতুনকে সারিবদ্ধ করার প্রক্রিয়ার মধ্য দিয়ে যেতে না হয়। এটি ব্যাপকভাবে উন্নয়ন প্রক্রিয়া সহজতর.

কাজ বাতিল করা এড়িয়ে চলুন

আপনার সাধারণত একটি বিদ্যমান ওয়ার্করিকোয়েস্ট বাতিল করা এবং একটি নতুন সারিবদ্ধ করা এড়ানো উচিত। এটি করার ফলে অ্যাপটি নির্দিষ্ট কাজের পুনরাবৃত্তি করতে পারে এবং আপনাকে উল্লেখযোগ্য পরিমাণে অতিরিক্ত কোড লিখতে হতে পারে।

যেখানে একটি WorkRequest বাতিল করা সমস্যা সৃষ্টি করতে পারে তার নিম্নলিখিত উদাহরণগুলি বিবেচনা করুন:

  • ব্যাক-এন্ড অনুরোধ: সার্ভারে পাঠানোর জন্য একটি পেলোড গণনা করার সময় আপনি যদি একজন Worker বাতিল করেন, তাহলে নতুন Worker আবার শুরু করতে হবে এবং সম্ভাব্য ব্যয়বহুল পেলোড পুনরায় গণনা করতে হবে।
  • সময়সূচী: আপনি যদি একটি PeriodicWorkRequest বাতিল করেন এবং আপনি একই সময়সূচীতে নতুন PeriodicWorkRequest এক্সিকিউট করতে চান, তাহলে নতুন এক্সিকিউশন সময় আগের কাজের অনুরোধের সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করতে আপনাকে একটি অফসেট সময় গণনা করতে হবে।

updateWork() API আপনাকে একটি নতুন অনুরোধ বাতিল এবং সারিবদ্ধ করার ঝামেলা ছাড়াই একটি কাজের অনুরোধের সীমাবদ্ধতা এবং অন্যান্য পরামিতি আপডেট করতে দেয়।

কখন কাজ বাতিল করতে হবে

এমন কিছু ক্ষেত্রে আছে যেখানে updateWork() কল করার পরিবর্তে আপনার সরাসরি একটি WorkRequest বাতিল করা উচিত। আপনি যে কাজটি সারিবদ্ধ করেছেন তার মৌলিক প্রকৃতি পরিবর্তন করতে চাইলে আপনার এটি করা উচিত।

কখন কাজ আপডেট করতে হবে

একটি ফটো অ্যাপ কল্পনা করুন যেটি ব্যবহারকারীর ফটোগুলির দৈনিক ব্যাকআপ করে। এটি করার জন্য এটি একটি PeriodicWorkRequest সারিবদ্ধ করেছে৷ WorkRequest সীমাবদ্ধতা রয়েছে যার জন্য ডিভাইসটিকে চার্জ করা এবং ওয়াইফাইয়ের সাথে সংযুক্ত করা প্রয়োজন৷

যাইহোক, ব্যবহারকারী একটি দ্রুত চার্জার ব্যবহার করে দিনে 20 মিনিটের জন্য তাদের ডিভাইস চার্জ করে। এই ক্ষেত্রে, অ্যাপটি চার্জিং সীমাবদ্ধতা শিথিল করার জন্য WorkRequest আপডেট করতে চাইতে পারে, যাতে ডিভাইসটি সম্পূর্ণ চার্জ না হওয়া সত্ত্বেও এটি ফটোগুলি আপলোড করতে পারে।

এই পরিস্থিতিতে, আপনি কাজের অনুরোধের সীমাবদ্ধতা আপডেট করতে updateWork() পদ্ধতি ব্যবহার করতে পারেন।

কিভাবে কাজ আপডেট করবেন

updateWork() পদ্ধতিটি একটি বিদ্যমান WorkRequest আপডেট করার একটি সহজ উপায় প্রদান করে, একটি নতুনকে বাতিল ও সারিবদ্ধ না করে।

আপডেট সারিবদ্ধ কাজ ব্যবহার করতে এই পদক্ষেপগুলি অনুসরণ করুন:

  1. সারিবদ্ধ কাজের জন্য বিদ্যমান আইডি পান : আপনি যে WorkRequest আপডেট করতে চান তার ID পান। আপনি যেকোনো getWorkInfo API-এর সাহায্যে এই আইডিটি পুনরুদ্ধার করতে পারেন, অথবা ম্যানুয়ালি আইডিটিকে সারিবদ্ধ করার আগে সর্বজনীন সম্পত্তি WorkRequest.id এর সাথে পুনরুদ্ধারের জন্য প্রাথমিক WorkRequest থেকে টিকে থাকতে পারেন।
  2. নতুন WorkRequest তৈরি করুন : একটি নতুন WorkRequest তৈরি করুন এবং WorkRequest.Builder.setID() ব্যবহার করুন যাতে বিদ্যমান WorkRequest এর সাথে তার আইডি সেট করা যায়।
  3. সীমাবদ্ধতা সেট করুন : WorkRequest.Builder.setConstraints() ব্যবহার করুন WorkManager নতুন সীমাবদ্ধতা পাস করতে।
  4. আপডেটওয়ার্ককে কল করুন : updateWork() করতে নতুন কাজের অনুরোধটি পাস করুন।

কাজের উদাহরণ আপডেট করুন

এখানে কোটলিনে একটি উদাহরণ কোড স্নিপেট রয়েছে যা প্রদর্শন করে যে কীভাবে ফটো আপলোড করার জন্য ব্যবহৃত WorkRequest ব্যাটারি সীমাবদ্ধতা পরিবর্তন করতে updateWork() পদ্ধতি ব্যবহার করতে হয়:

suspend fun updatePhotoUploadWork() {
    // Get instance of WorkManager.
    val workManager = WorkManager.getInstance(context)

    // Retrieve the work request ID. In this example, the work being updated is unique
    // work so we can retrieve the ID using the unique work name.
    val photoUploadWorkInfoList = workManager.getWorkInfosForUniqueWork(
        PHOTO_UPLOAD_WORK_NAME
    ).await()

    val existingWorkRequestId = photoUploadWorkInfoList.firstOrNull()?.id ?: return

    // Update the constraints of the WorkRequest to not require a charging device.
    val newConstraints = Constraints.Builder()
        // Add other constraints as required here.
        .setRequiresCharging(false)
        .build()

    // Create new WorkRequest from existing Worker, new constraints, and the id of the old WorkRequest.
    val updatedWorkRequest: WorkRequest =
        OneTimeWorkRequestBuilder<MyWorker>()
            .setConstraints(newConstraints)
            .setId(existingWorkRequestId)
            .build()

    // Pass the new WorkRequest to updateWork().
    workManager.updateWork(updatedWorkRequest)
}

ফলাফল হ্যান্ডেল

updateWork() একটি ListenableFuture<UpdateResult> প্রদান করে। প্রদত্ত UpdateResult বেশ কয়েকটি মানগুলির মধ্যে একটি থাকতে পারে যা WorkManager আপনার পরিবর্তনগুলি প্রয়োগ করতে সক্ষম হয়েছিল কিনা তা রূপরেখা দেয়৷ এটি কখন পরিবর্তনটি প্রয়োগ করতে সক্ষম হয়েছিল তাও নির্দেশ করে৷

আরও তথ্যের জন্য, updateWork() এবং UpdateResult রেফারেন্স দেখুন।

প্রজন্মের সাথে কাজ ট্র্যাক করুন

প্রতিবার যখন আপনি একটি WorkRequest আপডেট করেন, তখন এটির প্রজন্ম এক এক করে বৃদ্ধি পায়। এটি আপনাকে ঠিক কোন WorkRequest বর্তমানে সারিবদ্ধ আছে তা ট্র্যাক করতে দেয়। কাজের অনুরোধগুলি পর্যবেক্ষণ, ট্রেসিং এবং পরীক্ষা করার সময় জেনারেশন আপনাকে আরও নিয়ন্ত্রণ প্রদান করে।

একটি WorkRequest এর প্রজন্ম পেতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. WorkInfo : WorkManager.getWorkInfoById() কে কল করুন আপনার WorkRequest এর সাথে সম্পর্কিত WorkInfo এর একটি উদাহরণ পুনরুদ্ধার করতে।
    • আপনি একাধিক পদ্ধতির একটিতে কল করতে পারেন যা একটি WorkInfo প্রদান করে। আরও তথ্যের জন্য, WorkManager রেফারেন্স দেখুন।
  2. getGeneration : WorkInfo এর উদাহরণে getGeneration() কল করুন। Int প্রত্যাবর্তন WorkRequest এর প্রজন্মের সাথে মিলে যায়।
    • মনে রাখবেন যে কোনও প্রজন্মের ক্ষেত্র বা সম্পত্তি নেই, শুধুমাত্র WorkInfo.getGeneration() পদ্ধতি।

ট্র্যাক প্রজন্মের উদাহরণ

একটি WorkRequest এর জেনারেশন পুনরুদ্ধার করার জন্য উপরে বর্ণিত কর্মপ্রবাহের একটি উদাহরণ প্রয়োগ করা হল।

// Get instance of WorkManager.
val workManager = WorkManager.getInstance(context)

// Retrieve WorkInfo instance.
val workInfo = workManager.getWorkInfoById(oldWorkRequestId)

// Call getGeneration to retrieve the generation.
val generation = workInfo.getGeneration()

কাজ আপডেট করার জন্য নীতি

পূর্বে, পর্যায়ক্রমিক কাজ আপডেট করার প্রস্তাবিত সমাধান ছিল ExistingPeriodicWorkPolicy.REPLACE নীতির সাথে একটি PeriodicWorkRequest সারিবদ্ধ করা। যদি একই অনন্য id সহ একটি মুলতুবি PeriodicWorkRequest থাকে, তাহলে নতুন কাজের অনুরোধটি বাতিল করবে এবং মুছে দেবে। ExistingPeriodicWorkPolicy.UPDATE ব্যবহার করে কর্মপ্রবাহের পক্ষে এই নীতিটি এখন অবমূল্যায়িত হয়েছে।

উদাহরণস্বরূপ, একটি PeriodicWorkRequest এর সাথে enqueueUniquePeriodicWork ব্যবহার করার সময়, আপনি ExistingPeriodicWorkPolicy.UPDATE নীতির সাথে নতুন PeriodicWorkRequest আরম্ভ করতে পারেন। একই অনন্য নামের একটি মুলতুবি PeriodicWorkRequest থাকলে, WorkManager এটিকে নতুন স্পেসিফিকেশনে আপডেট করে। এই ওয়ার্কফ্লো অনুসরণ করে, updateWork() ব্যবহার করার প্রয়োজন নেই।