কাজের অনুরোধ সংজ্ঞায়িত করুন

শুরু করার নির্দেশিকায় একটি WorkRequest তৈরি এবং সেটিকে কিউতে যুক্ত করার পদ্ধতি বর্ণনা করা হয়েছে।

এই নির্দেশিকায় আপনি শিখবেন কীভাবে সাধারণ ব্যবহারের ক্ষেত্রগুলি পরিচালনা করার জন্য WorkRequest অবজেক্টগুলি সংজ্ঞায়িত এবং কাস্টমাইজ করতে হয়, যেমন:

  • এককালীন এবং পুনরাবৃত্তিমূলক কাজের সময়সূচী তৈরি করুন
  • কাজের ক্ষেত্রে সীমাবদ্ধতা আরোপ করুন, যেমন ওয়াই-ফাই বা চার্জিংয়ের প্রয়োজন।
  • কাজ সম্পাদনে ন্যূনতম বিলম্ব নিশ্চিত করুন।
  • পুনরায় চেষ্টা এবং পিছু হটার কৌশল নির্ধারণ করুন
  • কাজে ইনপুট ডেটা পাঠান
  • ট্যাগ ব্যবহার করে সম্পর্কিত কাজগুলোকে একসাথে দলবদ্ধ করুন

সংক্ষিপ্ত বিবরণ

WorkManager-এ একটি WorkRequest ব্যবহার করে কাজ সংজ্ঞায়িত করা হয়। WorkManager-এর মাধ্যমে যেকোনো কাজ শিডিউল করতে হলে, আপনাকে প্রথমে একটি WorkRequest অবজেক্ট তৈরি করতে হবে এবং তারপর সেটিকে কিউ-তে যুক্ত করতে হবে।

কোটলিন

val myWorkRequest = ...
WorkManager.getInstance(myContext).enqueue(myWorkRequest)

জাভা

WorkRequest myWorkRequest = ...
WorkManager.getInstance(myContext).enqueue(myWorkRequest);

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

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

এককালীন কাজের সময়সূচী নির্ধারণ করুন

সাধারণ কাজের জন্য, যার জন্য কোনো অতিরিক্ত কনফিগারেশনের প্রয়োজন নেই, from স্ট্যাটিক মেথডটি ব্যবহার করুন:

কোটলিন

val myWorkRequest = OneTimeWorkRequest.from(MyWork::class.java)

জাভা

WorkRequest myWorkRequest = OneTimeWorkRequest.from(MyWork.class);

আরও জটিল কাজের জন্য আপনি একজন বিল্ডারের সাহায্য নিতে পারেন:

কোটলিন

val uploadWorkRequest: WorkRequest =
   OneTimeWorkRequestBuilder<MyWork>()
       // Additional configuration
       .build()

জাভা

WorkRequest uploadWorkRequest =
   new OneTimeWorkRequest.Builder(MyWork.class)
       // Additional configuration
       .build();

দ্রুত কাজের সময়সূচী নির্ধারণ করুন

WorkManager 2.7.0 ‘এক্সপেডিটেড ওয়ার্ক’ বা ‘ত্বরিত কাজ’-এর ধারণাটি চালু করেছে। এটি WorkManager-কে গুরুত্বপূর্ণ কাজ সম্পাদন করার সুযোগ দেয় এবং একই সাথে রিসোর্স ব্যবহারের উপর সিস্টেমকে আরও ভালো নিয়ন্ত্রণ প্রদান করে।

ত্বরান্বিত কাজ নিম্নলিখিত বৈশিষ্ট্যগুলির জন্য উল্লেখযোগ্য:

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

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

কোটা

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

একটি অ্যাপের জন্য উপলব্ধ এক্সিকিউশন টাইম স্ট্যান্ডবাই বাকেট এবং প্রসেসের গুরুত্বের উপর ভিত্তি করে নির্ধারিত হয়।

যখন এক্সিকিউশন কোটা কোনো এক্সপেডিটেড জবকে অবিলম্বে চালানোর অনুমতি দেয় না, তখন কী ঘটবে তা আপনি নির্ধারণ করতে পারেন। বিস্তারিত জানার জন্য নিম্নলিখিত কোড স্নিপেটগুলো দেখুন।

দ্রুত কাজ সম্পাদন করুন

WorkManager 2.7 থেকে, আপনার অ্যাপ একটি এক্সপেডিটেড জব ব্যবহার করে কোনো WorkRequest যত দ্রুত সম্ভব চালানোর জন্য setExpedited() কল করতে পারে। নিচের কোড স্নিপেটটিতে setExpedited() কীভাবে ব্যবহার করতে হয় তার একটি উদাহরণ দেওয়া হলো:

কোটলিন

val request = OneTimeWorkRequestBuilder<SyncWorker>()
    <b>.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)</b>
    .build()

WorkManager.getInstance(context)
    .enqueue(request)

জাভা

OneTimeWorkRequest request = new OneTimeWorkRequestBuilder<T>()
    .setInputData(inputData)
    <b>.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)</b>
    .build();

এই উদাহরণে, আমরা OneTimeWorkRequest এর একটি ইনস্ট্যান্স ইনিশিয়ালাইজ করি এবং এর উপর setExpedited() কল করি। এরপর এই রিকোয়েস্টটি এক্সপেডিটেড ওয়ার্ক বা দ্রুত সম্পন্ন করার কাজে পরিণত হয়। যদি কোটা অনুমতি দেয়, তবে এটি অবিলম্বে ব্যাকগ্রাউন্ডে চলতে শুরু করবে। যদি কোটা শেষ হয়ে যায়, তাহলে OutOfQuotaPolicy প্যারামিটারটি নির্দেশ করে যে রিকোয়েস্টটি সাধারণ, নন-এক্সপেডিটেড কাজ হিসেবে চালানো উচিত।

পশ্চাৎ সামঞ্জস্য এবং ফোরগ্রাউন্ড পরিষেবাগুলি

দ্রুত সম্পন্ন করার কাজগুলোর জন্য পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্যতা বজায় রাখতে, WorkManager অ্যান্ড্রয়েড ১২-এর চেয়ে পুরোনো প্ল্যাটফর্ম সংস্করণগুলোতে একটি ফোরগ্রাউন্ড সার্ভিস চালাতে পারে। ফোরগ্রাউন্ড সার্ভিসগুলো ব্যবহারকারীকে একটি নোটিফিকেশন প্রদর্শন করতে পারে।

অ্যান্ড্রয়েড ১২-এর আগে, আপনার Worker-এর getForegroundInfoAsync() এবং getForegroundInfo() মেথডগুলো WorkManager-কে setExpedited() কল করার সময় একটি নোটিফিকেশন প্রদর্শন করতে সক্ষম করে।

যদি আপনি টাস্কটিকে একটি ত্বরান্বিত কাজ হিসেবে চালাতে অনুরোধ করতে চান, তাহলে যেকোনো ListenableWorker অবশ্যই getForegroundInfo মেথডটি ইমপ্লিমেন্ট করতে হবে।

অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণ টার্গেট করার ক্ষেত্রে, সংশ্লিষ্ট setForeground মেথডের মাধ্যমে ফোরগ্রাউন্ড সার্ভিসগুলো আপনার জন্য উপলব্ধ থাকে।

শ্রমিক

কর্মীরা জানেন না যে তারা যে কাজটি করছেন তা ত্বরান্বিত করা হয়েছে কি না। কিন্তু অ্যান্ড্রয়েডের কিছু সংস্করণে, যখন কোনো WorkRequest ত্বরান্বিত করা হয়, তখন কর্মীরা একটি বিজ্ঞপ্তি প্রদর্শন করতে পারেন।

এটি সক্ষম করার জন্য, WorkManager getForegroundInfoAsync() মেথডটি প্রদান করে, যা আপনাকে অবশ্যই ইমপ্লিমেন্ট করতে হবে, যাতে WorkManager প্রয়োজনে আপনার জন্য একটি ForegroundService শুরু করার জন্য একটি নোটিফিকেশন প্রদর্শন করতে পারে।

CoroutineWorker

আপনি যদি CoroutineWorker ব্যবহার করেন, তাহলে আপনাকে অবশ্যই getForegroundInfo() ইমপ্লিমেন্ট করতে হবে। এরপর doWork() এর মধ্যে setForeground() ফাংশনে এই তথ্যটি পাস করতে হবে। অ্যান্ড্রয়েড ১২-এর পূর্ববর্তী সংস্করণগুলোতে এমনটা করলে নোটিফিকেশন তৈরি হবে।

নিম্নলিখিত উদাহরণটি বিবেচনা করুন:

  class ExpeditedWorker(appContext: Context, workerParams: WorkerParameters):
   CoroutineWorker(appContext, workerParams) {

   override suspend fun getForegroundInfo(): ForegroundInfo {
       return ForegroundInfo(
           NOTIFICATION_ID, createNotification()
       )
   }

   override suspend fun doWork(): Result {
       TODO()
   }

    private fun createNotification() : Notification {
       TODO()
    }

}

কোটা নীতিমালা

আপনার অ্যাপ তার এক্সিকিউশন কোটায় পৌঁছালে ত্বরান্বিত কাজের কী হবে তা আপনি নিয়ন্ত্রণ করতে পারেন। চালিয়ে যেতে, আপনি setExpedited() পাস করতে পারেন:

  • OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST , যা জবটিকে একটি সাধারণ ওয়ার্ক রিকোয়েস্ট হিসেবে রান করায়। আগের কোড স্নিপেটটিতে এটি দেখানো হয়েছে।
  • OutOfQuotaPolicy.DROP_WORK_REQUEST , যা পর্যাপ্ত কোটা না থাকলে অনুরোধটি বাতিল করে দেয়।

স্থগিত ত্বরান্বিত কাজ

সিস্টেমটি কোনো নির্দিষ্ট জরুরি কাজ আহ্বান করার পর যত দ্রুত সম্ভব তা সম্পাদন করার চেষ্টা করে। তবে, অন্যান্য ধরনের কাজের মতোই, সিস্টেমটি নতুন জরুরি কাজের শুরু স্থগিত করতে পারে, যেমন নিম্নলিখিত ক্ষেত্রগুলিতে:

  • লোড : সিস্টেমের লোড খুব বেশি, যা তখন হতে পারে যখন একসাথে অনেক বেশি কাজ চলছে, অথবা যখন সিস্টেমে পর্যাপ্ত মেমরি থাকে না।
  • কোটা : দ্রুত কাজের কোটার সীমা অতিক্রম করা হয়েছে। দ্রুত কাজ একটি কোটা ব্যবস্থা ব্যবহার করে যা অ্যাপ স্ট্যান্ডবাই বাকেট-এর উপর ভিত্তি করে তৈরি এবং এটি একটি চলমান সময়সীমার মধ্যে সর্বোচ্চ সম্পাদনের সময়কে সীমিত করে। দ্রুত কাজের জন্য ব্যবহৃত কোটাগুলো অন্যান্য ধরনের ব্যাকগ্রাউন্ড কাজের জন্য ব্যবহৃত কোটার চেয়ে বেশি কঠোর।

পর্যায়ক্রমিক কাজের সময়সূচী তৈরি করুন

আপনার অ্যাপের মাঝে মাঝে নির্দিষ্ট কিছু কাজ পর্যায়ক্রমে চালানোর প্রয়োজন হতে পারে। উদাহরণস্বরূপ, আপনি পর্যায়ক্রমে আপনার ডেটার ব্যাকআপ নিতে, আপনার অ্যাপে নতুন কন্টেন্ট ডাউনলোড করতে, বা কোনো সার্ভারে লগ আপলোড করতে চাইতে পারেন।

পর্যায়ক্রমে কার্যকর হয় এমন একটি WorkRequest অবজেক্ট তৈরি করতে PeriodicWorkRequest যেভাবে ব্যবহার করবেন, তা এখানে দেওয়া হলো:

কোটলিন

val saveRequest =
       PeriodicWorkRequestBuilder<SaveImageToFileWorker>(1, TimeUnit.HOURS)
    // Additional configuration
           .build()

জাভা

PeriodicWorkRequest saveRequest =
       new PeriodicWorkRequest.Builder(SaveImageToFileWorker.class, 1, TimeUnit.HOURS)
           // Constraints
           .build();

এই উদাহরণে, কাজটি এক ঘণ্টার ব্যবধানে নির্ধারিত করা হয়েছে।

বিরতি কালকে পুনরাবৃত্তির মধ্যবর্তী ন্যূনতম সময় হিসাবে সংজ্ঞায়িত করা হয়। কর্মীটি ঠিক কখন কার্যকর হবে তা আপনার WorkRequest অবজেক্টে ব্যবহৃত সীমাবদ্ধতা এবং সিস্টেম দ্বারা সম্পাদিত অপ্টিমাইজেশনের উপর নির্ভর করে।

নমনীয় দৌড়ের ব্যবধান

যদি আপনার কাজের ধরন রান টাইমিংয়ের প্রতি সংবেদনশীল হয়, তাহলে আপনি আপনার PeriodicWorkRequest প্রতিটি ইন্টারভ্যাল পিরিয়ডের ভেতরে একটি ফ্লেক্স পিরিয়ডে চালানোর জন্য কনফিগার করতে পারেন, যেমনটি চিত্র ১-এ দেখানো হয়েছে।

আপনি একটি পর্যায়ক্রমিক কাজের জন্য একটি ফ্লেক্স ইন্টারভাল সেট করতে পারেন। আপনি একটি রিপিট ইন্টারভাল এবং একটি ফ্লেক্স ইন্টারভাল নির্ধারণ করেন, যা রিপিট ইন্টারভালের শেষে একটি নির্দিষ্ট পরিমাণ সময় নির্দেশ করে। WorkManager প্রতিটি চক্রে ফ্লেক্স ইন্টারভালের কোনো এক সময়ে আপনার কাজটি চালানোর চেষ্টা করে।

চিত্র ১। রেখাচিত্রটিতে পরিবর্তনশীল পর্যায়কালসহ পুনরাবৃত্তিমূলক ব্যবধান দেখানো হয়েছে, যে পর্যায়কালে কাজটি সম্পন্ন হতে পারে।

ফ্লেক্স পিরিয়ড সহ পর্যায়ক্রমিক কাজ নির্ধারণ করতে, PeriodicWorkRequest তৈরি করার সময় repeatInterval এর সাথে flexInterval ও পাস করতে হয়। ফ্লেক্স পিরিয়ডটি repeatInterval - flexInterval থেকে শুরু হয়ে ব্যবধানটির শেষ পর্যন্ত চলে।

নিম্নলিখিতটি পর্যায়ক্রমিক কাজের একটি উদাহরণ যা প্রতি এক ঘণ্টা সময়ের শেষ ১৫ মিনিটে চলতে পারে।

কোটলিন

val myUploadWork = PeriodicWorkRequestBuilder<SaveImageToFileWorker>(
       1, TimeUnit.HOURS, // repeatInterval (the period cycle)
       15, TimeUnit.MINUTES) // flexInterval
    .build()

জাভা

WorkRequest saveRequest =
       new PeriodicWorkRequest.Builder(SaveImageToFileWorker.class,
               1, TimeUnit.HOURS,
               15, TimeUnit.MINUTES)
           .build();

পুনরাবৃত্তির ব্যবধান অবশ্যই PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS এর চেয়ে বেশি বা সমান হতে হবে এবং ফ্লেক্স ব্যবধান অবশ্যই PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS- এর চেয়ে বেশি বা সমান হতে হবে।

পর্যায়ক্রমিক কাজের উপর সীমাবদ্ধতার প্রভাব

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

কাজের সীমাবদ্ধতা

Constraints নিশ্চিত করে যে সর্বোত্তম শর্ত পূরণ না হওয়া পর্যন্ত কাজ স্থগিত থাকে। WorkManager-এর জন্য নিম্নলিখিত সীমাবদ্ধতাগুলি উপলব্ধ:

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

কিছু সীমাবদ্ধতা তৈরি করতে এবং সেটিকে কোনো কাজের সাথে যুক্ত করতে, Constraints.Builder() ব্যবহার করে একটি Constraints ইনস্ট্যান্স তৈরি করুন এবং সেটিকে আপনার WorkRequest.Builder() -এ অ্যাসাইন করুন।

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি এমন একটি ওয়ার্ক রিকোয়েস্ট তৈরি করে যা শুধুমাত্র তখনই চলে যখন ব্যবহারকারীর ডিভাইসটি চার্জিং অবস্থায় এবং ওয়াই-ফাই-এর সাথে সংযুক্ত থাকে:

কোটলিন

val constraints = Constraints.Builder()
   .setRequiredNetworkType(NetworkType.UNMETERED)
   .setRequiresCharging(true)
   .build()

val myWorkRequest: WorkRequest =
   OneTimeWorkRequestBuilder<MyWork>()
       .setConstraints(constraints)
       .build()

জাভা

Constraints constraints = new Constraints.Builder()
       .setRequiredNetworkType(NetworkType.UNMETERED)
       .setRequiresCharging(true)
       .build();

WorkRequest myWorkRequest =
       new OneTimeWorkRequest.Builder(MyWork.class)
               .setConstraints(constraints)
               .build();

যখন একাধিক শর্ত নির্দিষ্ট করা হয়, তখন সমস্ত শর্ত পূরণ হলেই আপনার কাজটি চলবে।

আপনার কাজটি চলার সময় যদি কোনো শর্ত পূরণ না হয়, তাহলে WorkManager আপনার ওয়ার্কারকে থামিয়ে দেবে। এরপর সমস্ত শর্ত পূরণ হয়ে গেলে কাজটি পুনরায় চেষ্টা করা হবে।

বিলম্বিত কাজ

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

আপনার কাজটি কিউতে যুক্ত করার পর অন্তত ১০ মিনিট পরে চালানোর জন্য কীভাবে সেট করবেন, তার একটি উদাহরণ এখানে দেওয়া হলো।

কোটলিন

val myWorkRequest = OneTimeWorkRequestBuilder<MyWork>()
   .setInitialDelay(10, TimeUnit.MINUTES)
   .build()

জাভা

WorkRequest myWorkRequest =
      new OneTimeWorkRequest.Builder(MyWork.class)
               .setInitialDelay(10, TimeUnit.MINUTES)
               .build();

যদিও উদাহরণটিতে একটি OneTimeWorkRequest জন্য কীভাবে প্রাথমিক বিলম্ব সেট করতে হয় তা দেখানো হয়েছে, আপনি একটি PeriodicWorkRequest জন্যও প্রাথমিক বিলম্ব সেট করতে পারেন। সেক্ষেত্রে, আপনার পর্যায়ক্রমিক কাজের শুধুমাত্র প্রথম রানটি বিলম্বিত হবে।

পুনরায় চেষ্টা এবং পিছু হটার নীতি

যদি আপনার প্রয়োজন হয় যে WorkManager আপনার কাজটি পুনরায় চেষ্টা করুক, তাহলে আপনি আপনার ওয়ার্কার থেকে Result.retry() রিটার্ন করতে পারেন। এরপর একটি ব্যাকঅফ ডিলে এবং ব্যাকঅফ পলিসি অনুযায়ী আপনার কাজটি পুনঃনির্ধারিত হয়।

  • ব্যাকঅফ ডিলে প্রথম চেষ্টার পর আপনার কাজটি পুনরায় করার আগে অপেক্ষা করার ন্যূনতম সময়কে নির্দিষ্ট করে। এই মান ১০ সেকেন্ডের (বা MIN_BACKOFF_MILLIS ) কম হতে পারবে না।

  • ব্যাকঅফ পলিসি নির্ধারণ করে যে পরবর্তী পুনঃপ্রচেষ্টাগুলোর জন্য সময়ের সাথে সাথে ব্যাকঅফ বিলম্ব কীভাবে বৃদ্ধি পাবে। WorkManager দুটি ব্যাকঅফ পলিসি সমর্থন করে, LINEAR এবং EXPONENTIAL

প্রতিটি ওয়ার্ক রিকোয়েস্টের একটি ব্যাকঅফ পলিসি এবং ব্যাকঅফ ডিলে থাকে। ডিফল্ট পলিসিটি হলো EXPONENTIAL এবং এর ডিলে ৩০ সেকেন্ড, কিন্তু আপনি আপনার ওয়ার্ক রিকোয়েস্ট কনফিগারেশনে এটি পরিবর্তন করতে পারেন।

এখানে ব্যাকঅফ ডিলে এবং পলিসি কাস্টমাইজ করার একটি উদাহরণ দেওয়া হলো।

কোটলিন

val myWorkRequest = OneTimeWorkRequestBuilder<MyWork>()
   .setBackoffCriteria(
       BackoffPolicy.LINEAR,
       WorkRequest.MIN_BACKOFF_MILLIS,
       TimeUnit.MILLISECONDS)
   .build()

জাভা

WorkRequest myWorkRequest =
       new OneTimeWorkRequest.Builder(MyWork.class)
               .setBackoffCriteria(
                       BackoffPolicy.LINEAR,
                       WorkRequest.MIN_BACKOFF_MILLIS,
                       TimeUnit.MILLISECONDS)
               .build();

এই উদাহরণে, সর্বনিম্ন ব্যাকঅফ ডিলে সর্বনিম্ন অনুমোদিত মান, অর্থাৎ ১০ সেকেন্ডে সেট করা হয়েছে। যেহেতু পলিসিটি LINEAR , তাই প্রতিটি নতুন চেষ্টার সাথে রিট্রাই ইন্টারভ্যাল প্রায় ১০ সেকেন্ড করে বাড়বে। উদাহরণস্বরূপ, Result.retry() দিয়ে শেষ হওয়া প্রথম রানটি ১০ সেকেন্ড পর আবার চেষ্টা করা হবে, এবং যদি পরবর্তী চেষ্টাগুলোর পরেও কাজটি Result.retry() রিটার্ন করতে থাকে, তাহলে এরপর যথাক্রমে ২০, ৩০, ৪০, ইত্যাদি সেকেন্ড পর চেষ্টা করা হবে। যদি ব্যাকঅফ পলিসিটি EXPONENTIAL হিসেবে সেট করা হতো, তাহলে রিট্রাইয়ের সময়কাল ২০, ৪০ এবং ৮০-এর কাছাকাছি হতো।

ট্যাগ কাজ

প্রতিটি কাজের অনুরোধের একটি অনন্য শনাক্তকারী থাকে, যা পরবর্তীতে কাজটি বাতিল করতে বা এর অগ্রগতি পর্যবেক্ষণ করতে ব্যবহার করা যেতে পারে।

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

উদাহরণস্বরূপ, WorkManager.cancelAllWorkByTag(String) একটি নির্দিষ্ট ট্যাগযুক্ত সমস্ত কাজের অনুরোধ বাতিল করে, এবং WorkManager.getWorkInfosByTag(String) WorkInfo অবজেক্টগুলির একটি তালিকা ফেরত দেয় যা কাজের বর্তমান অবস্থা নির্ধারণ করতে ব্যবহার করা যেতে পারে।

নিচের কোডটি দেখায় কিভাবে আপনি আপনার কাজে একটি 'cleanup' ট্যাগ যোগ করতে পারেন:

কোটলিন

val myWorkRequest = OneTimeWorkRequestBuilder<MyWork>()
   .addTag("cleanup")
   .build()

জাভা

WorkRequest myWorkRequest =
       new OneTimeWorkRequest.Builder(MyWork.class)
       .addTag("cleanup")
       .build();

অবশেষে, একটিমাত্র ওয়ার্ক রিকোয়েস্টে একাধিক ট্যাগ যোগ করা যায়। অভ্যন্তরীণভাবে এই ট্যাগগুলো একগুচ্ছ স্ট্রিং হিসেবে সংরক্ষিত থাকে। WorkRequest এর সাথে যুক্ত ট্যাগগুলোর সেট পেতে আপনি WorkInfo.getTags() ব্যবহার করতে পারেন।

আপনার Worker ক্লাস থেকে, আপনি ListenableWorker.getTags() ব্যবহার করে এর ট্যাগ সেটটি পেতে পারেন।

ইনপুট ডেটা বরাদ্দ করুন

আপনার কাজটি করার জন্য ইনপুট ডেটার প্রয়োজন হতে পারে। উদাহরণস্বরূপ, ছবি আপলোড করার কাজের জন্য ইনপুট হিসেবে আপলোড করা ছবিটির URI-এর প্রয়োজন হতে পারে।

ইনপুট ভ্যালুগুলো একটি Data অবজেক্টে কী-ভ্যালু পেয়ার হিসেবে সংরক্ষিত থাকে এবং ওয়ার্ক রিকোয়েস্টে সেট করা যায়। WorkManager যখন কাজটি সম্পাদন করে, তখন এটি আপনার কাজে ইনপুট Data সরবরাহ করে। Worker ক্লাসটি Worker.getInputData() কল করার মাধ্যমে ইনপুট আর্গুমেন্টগুলো অ্যাক্সেস করতে পারে। নিচের কোডটিতে দেখানো হয়েছে কীভাবে আপনি ইনপুট ডেটা প্রয়োজন এমন একটি Worker ইনস্ট্যান্স তৈরি করতে পারেন এবং কীভাবে আপনার ওয়ার্ক রিকোয়েস্টে তা পাঠাতে পারেন।

কোটলিন

// Define the Worker requiring input
class UploadWork(appContext: Context, workerParams: WorkerParameters)
   : Worker(appContext, workerParams) {

   override fun doWork(): Result {
       val imageUriInput =
           inputData.getString("IMAGE_URI") ?: return Result.failure()

       uploadFile(imageUriInput)
       return Result.success()
   }
   ...
}

// Create a WorkRequest for your Worker and sending it input
val myUploadWork = OneTimeWorkRequestBuilder<UploadWork>()
   .setInputData(workDataOf(
       "IMAGE_URI" to "http://..."
   ))
   .build()

জাভা

// Define the Worker requiring input
public class UploadWork extends Worker {

   public UploadWork(Context appContext, WorkerParameters workerParams) {
       super(appContext, workerParams);
   }

   @NonNull
   @Override
   public Result doWork() {
       String imageUriInput = getInputData().getString("IMAGE_URI");
       if(imageUriInput == null) {
           return Result.failure();
       }

       uploadFile(imageUriInput);
       return Result.success();
   }
   ...
}

// Create a WorkRequest for your Worker and sending it input
WorkRequest myUploadWork =
      new OneTimeWorkRequest.Builder(UploadWork.class)
           .setInputData(
               new Data.Builder()
                   .putString("IMAGE_URI", "http://...")
                   .build()
           )
           .build();

একইভাবে, আপনি রিটার্ন ভ্যালু আউটপুট করার জন্য Data ক্লাস ব্যবহার করতে পারেন।

পরবর্তী পদক্ষেপ

'অবস্থা ও পর্যবেক্ষণ ' পাতায়, আপনি কাজের অবস্থা এবং আপনার কাজের অগ্রগতি কীভাবে পর্যবেক্ষণ করবেন সে সম্পর্কে আরও জানতে পারবেন।