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

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

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

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

ওভারভিউ

একটি WorkRequest মাধ্যমে WorkManager-এ কাজ সংজ্ঞায়িত করা হয়। 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 2.7 থেকে শুরু করে, আপনার অ্যাপ setExpedited() কল করে ঘোষণা করতে পারে যে একটি দ্রুত কাজ ব্যবহার করে একটি WorkRequest যত দ্রুত সম্ভব চালানো উচিত। নিম্নলিখিত কোড স্নিপেট কিভাবে setExpedited() ব্যবহার করতে হয় তার একটি উদাহরণ প্রদান করে:

কোটলিন

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

WorkManager.getInstance(context)
    .enqueue(request)

জাভা

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

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

পিছনের সামঞ্জস্য এবং অগ্রভাগের পরিষেবা

ত্বরান্বিত কাজের জন্য পিছনের দিকে সামঞ্জস্য বজায় রাখতে, WorkManager Android 12-এর থেকে পুরানো প্ল্যাটফর্ম সংস্করণগুলিতে একটি ফোরগ্রাউন্ড পরিষেবা চালাতে পারে৷ ফোরগ্রাউন্ড পরিষেবাগুলি ব্যবহারকারীকে একটি বিজ্ঞপ্তি প্রদর্শন করতে পারে৷

Android 12-এর আগে আপনি setExpedited() কল করলে আপনার ওয়ার্কারে getForegroundInfoAsync() এবং getForegroundInfo() পদ্ধতি ওয়ার্কম্যানেজারকে একটি বিজ্ঞপ্তি প্রদর্শন করতে সক্ষম করে।

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

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

কর্মী

শ্রমিকরা জানেন না যে তারা যে কাজ করছেন তা দ্রুত হচ্ছে কি না। কিন্তু WorkRequest ত্বরান্বিত হলে কর্মীরা Android এর কিছু সংস্করণে একটি বিজ্ঞপ্তি প্রদর্শন করতে পারেন।

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

কোরাটিন ওয়ার্কার

আপনি যদি একজন CoroutineWorker ব্যবহার করেন, তাহলে আপনাকে অবশ্যই getForegroundInfo() প্রয়োগ করতে হবে। তারপর আপনি এটিকে doWork() এর মধ্যে setForeground() এ পাস করুন। এটি করলে 12-এর আগে Android এর সংস্করণগুলিতে বিজ্ঞপ্তি তৈরি হবে।

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

  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 , যা পর্যাপ্ত কোটা না থাকলে অনুরোধটি বাতিল করে দেয়।

নমুনা অ্যাপ্লিকেশন

WorkManager 2.7.0 কিভাবে দ্রুত কাজ ব্যবহার করে তার একটি সম্পূর্ণ উদাহরণ দেখতে, GitHub-এ WorkManagerSample দেখুন।

স্থগিত দ্রুত কাজ

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

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

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

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

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

কোটলিন

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

জাভা

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

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

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

নমনীয় রান অন্তর

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

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

চিত্র 1. চিত্রটি নমনীয় সময়ের সাথে পুনরাবৃত্তিমূলক বিরতিগুলি দেখায় যেখানে কাজ চলতে পারে।

একটি ফ্লেক্স পিরিয়ড দিয়ে পর্যায়ক্রমিক কাজকে সংজ্ঞায়িত করতে, আপনি PeriodicWorkRequest তৈরি করার সময় repeatInterval সহ একটি flexInterval পাস করেন। ফ্লেক্স পিরিয়ড repeatInterval - flexInterval , এবং ব্যবধানের শেষ পর্যন্ত যায়।

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

কোটলিন

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 থেকে বেশি বা সমান হতে হবে।MIN_PERIODIC_INTERVAL_MILLIS এবং ফ্লেক্স ব্যবধান অবশ্যই PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS থেকে বেশি বা সমান হতে হবে।MIN_PERIODIC_FLEX_MILLIS।

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

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

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

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

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

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

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

কোটলিন

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 আপনার কর্মীকে থামিয়ে দেবে। সমস্ত সীমাবদ্ধতা পূরণ হয়ে গেলে কাজটি পুনরায় চেষ্টা করা হবে।

বিলম্বিত কাজ

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

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

কোটলিন

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

জাভা

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

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

পুনরায় চেষ্টা করুন এবং ব্যাকঅফ নীতি

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

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

  • ব্যাকঅফ নীতি সংজ্ঞায়িত করে কিভাবে পরবর্তী পুনঃপ্রচেষ্টার জন্য সময়ের সাথে সাথে ব্যাকঅফ বিলম্ব বাড়তে হবে। WorkManager 2টি ব্যাকঅফ নীতি সমর্থন করে, LINEAR এবং EXPONENTIAL

প্রতিটি কাজের অনুরোধের একটি ব্যাকঅফ নীতি এবং ব্যাকঅফ বিলম্ব রয়েছে। ডিফল্ট নীতিটি 30 সেকেন্ডের বিলম্বের সাথে EXPONENTIAL , কিন্তু আপনি এটিকে আপনার কাজের অনুরোধ কনফিগারেশনে ওভাররাইড করতে পারেন৷

এখানে ব্যাকঅফ বিলম্ব এবং নীতি কাস্টমাইজ করার একটি উদাহরণ।

কোটলিন

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

জাভা

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

এই উদাহরণে, ন্যূনতম ব্যাকঅফ বিলম্ব ন্যূনতম অনুমোদিত মান, 10 সেকেন্ডে সেট করা হয়েছে৷ যেহেতু নীতিটি LINEAR তাই পুনরায় চেষ্টার ব্যবধান প্রতিটি নতুন প্রচেষ্টার সাথে প্রায় 10 সেকেন্ড বৃদ্ধি পাবে৷ উদাহরণস্বরূপ, Result.retry() দিয়ে প্রথম রান শেষ করার 10 সেকেন্ড পরে আবার চেষ্টা করা হবে, তারপরে 20, 30, 40 এবং আরও অনেক কিছু, যদি কাজটি পরবর্তী প্রচেষ্টার পরে Result.retry() ফেরত দিতে থাকে। যদি ব্যাকঅফ নীতিটি EXPONENTIAL তে সেট করা হয়, তাহলে পুনরায় চেষ্টার সময়কাল ক্রম 20, 40, 80, এবং আরও কাছাকাছি হবে৷

ট্যাগ কাজ

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

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

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

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

কোটলিন

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 ক্লাস একটি রিটার্ন মান আউটপুট করতে ব্যবহার করা যেতে পারে। ইনপুট এবং আউটপুট ডেটা বিভাগ ইনপুট পরামিতি এবং প্রত্যাবর্তিত মানগুলিতে আরও বিস্তারিতভাবে কভার করা হয়েছে।

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

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

,

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

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

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

ওভারভিউ

একটি WorkRequest মাধ্যমে WorkManager-এ কাজ সংজ্ঞায়িত করা হয়। 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 2.7 থেকে শুরু করে, আপনার অ্যাপ setExpedited() কল করে ঘোষণা করতে পারে যে একটি দ্রুত কাজ ব্যবহার করে একটি WorkRequest যত দ্রুত সম্ভব চালানো উচিত। নিম্নলিখিত কোড স্নিপেট কিভাবে setExpedited() ব্যবহার করতে হয় তার একটি উদাহরণ প্রদান করে:

কোটলিন

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

WorkManager.getInstance(context)
    .enqueue(request)

জাভা

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

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

পিছনের সামঞ্জস্য এবং অগ্রভাগের পরিষেবা

ত্বরান্বিত কাজের জন্য পিছনের দিকে সামঞ্জস্য বজায় রাখতে, WorkManager Android 12-এর থেকে পুরানো প্ল্যাটফর্ম সংস্করণগুলিতে একটি ফোরগ্রাউন্ড পরিষেবা চালাতে পারে৷ ফোরগ্রাউন্ড পরিষেবাগুলি ব্যবহারকারীকে একটি বিজ্ঞপ্তি প্রদর্শন করতে পারে৷

Android 12-এর আগে আপনি setExpedited() কল করলে আপনার ওয়ার্কারে getForegroundInfoAsync() এবং getForegroundInfo() পদ্ধতি ওয়ার্কম্যানেজারকে একটি বিজ্ঞপ্তি প্রদর্শন করতে সক্ষম করে।

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

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

কর্মী

শ্রমিকরা জানেন না যে তারা যে কাজ করছেন তা দ্রুত হচ্ছে কি না। কিন্তু WorkRequest ত্বরান্বিত হলে কর্মীরা Android এর কিছু সংস্করণে একটি বিজ্ঞপ্তি প্রদর্শন করতে পারেন।

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

কোরাটিন ওয়ার্কার

আপনি যদি একজন CoroutineWorker ব্যবহার করেন, তাহলে আপনাকে অবশ্যই getForegroundInfo() প্রয়োগ করতে হবে। তারপর আপনি এটিকে doWork() এর মধ্যে setForeground() এ পাস করুন। এটি করলে 12-এর আগে Android এর সংস্করণগুলিতে বিজ্ঞপ্তি তৈরি হবে।

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

  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 , যা পর্যাপ্ত কোটা না থাকলে অনুরোধটি বাতিল করে দেয়।

নমুনা অ্যাপ্লিকেশন

WorkManager 2.7.0 কিভাবে দ্রুত কাজ ব্যবহার করে তার একটি সম্পূর্ণ উদাহরণ দেখতে, GitHub-এ WorkManagerSample দেখুন।

স্থগিত দ্রুত কাজ

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

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

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

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

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

কোটলিন

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

জাভা

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

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

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

নমনীয় রান অন্তর

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

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

চিত্র 1. চিত্রটি নমনীয় সময়ের সাথে পুনরাবৃত্তিমূলক বিরতিগুলি দেখায় যেখানে কাজ চলতে পারে।

একটি ফ্লেক্স পিরিয়ড দিয়ে পর্যায়ক্রমিক কাজকে সংজ্ঞায়িত করতে, আপনি PeriodicWorkRequest তৈরি করার সময় repeatInterval সহ একটি flexInterval পাস করেন। ফ্লেক্স পিরিয়ড repeatInterval - flexInterval , এবং ব্যবধানের শেষ পর্যন্ত যায়।

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

কোটলিন

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 থেকে বেশি বা সমান হতে হবে।MIN_PERIODIC_INTERVAL_MILLIS এবং ফ্লেক্স ব্যবধান অবশ্যই PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS থেকে বেশি বা সমান হতে হবে।MIN_PERIODIC_FLEX_MILLIS।

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

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

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

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

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

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

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

কোটলিন

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 আপনার কর্মীকে থামিয়ে দেবে। সমস্ত সীমাবদ্ধতা পূরণ হয়ে গেলে কাজটি পুনরায় চেষ্টা করা হবে।

বিলম্বিত কাজ

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

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

কোটলিন

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

জাভা

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

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

পুনরায় চেষ্টা করুন এবং ব্যাকঅফ নীতি

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

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

  • ব্যাকঅফ নীতি সংজ্ঞায়িত করে কিভাবে পরবর্তী পুনঃপ্রচেষ্টার জন্য সময়ের সাথে সাথে ব্যাকঅফ বিলম্ব বাড়তে হবে। WorkManager 2টি ব্যাকঅফ নীতি সমর্থন করে, LINEAR এবং EXPONENTIAL

প্রতিটি কাজের অনুরোধের একটি ব্যাকঅফ নীতি এবং ব্যাকঅফ বিলম্ব রয়েছে। ডিফল্ট নীতিটি 30 সেকেন্ডের বিলম্বের সাথে EXPONENTIAL , কিন্তু আপনি এটিকে আপনার কাজের অনুরোধ কনফিগারেশনে ওভাররাইড করতে পারেন৷

এখানে ব্যাকঅফ বিলম্ব এবং নীতি কাস্টমাইজ করার একটি উদাহরণ।

কোটলিন

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

জাভা

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

এই উদাহরণে, ন্যূনতম ব্যাকঅফ বিলম্ব ন্যূনতম অনুমোদিত মান, 10 সেকেন্ডে সেট করা হয়েছে৷ যেহেতু নীতিটি LINEAR তাই পুনরায় চেষ্টার ব্যবধান প্রতিটি নতুন প্রচেষ্টার সাথে প্রায় 10 সেকেন্ড বৃদ্ধি পাবে৷ উদাহরণস্বরূপ, Result.retry() দিয়ে প্রথম রান শেষ করার 10 সেকেন্ড পরে আবার চেষ্টা করা হবে, তারপরে 20, 30, 40 এবং আরও অনেক কিছু, যদি কাজটি পরবর্তী প্রচেষ্টার পরে Result.retry() ফেরত দিতে থাকে। যদি ব্যাকঅফ নীতিটি EXPONENTIAL তে সেট করা হয়, তাহলে পুনরায় চেষ্টার সময়কাল ক্রম 20, 40, 80, এবং আরও কাছাকাছি হবে৷

ট্যাগ কাজ

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

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

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

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

কোটলিন

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 ক্লাস একটি রিটার্ন মান আউটপুট করতে ব্যবহার করা যেতে পারে। ইনপুট এবং আউটপুট ডেটা বিভাগ ইনপুট পরামিতি এবং প্রত্যাবর্তিত মানগুলিতে আরও বিস্তারিতভাবে কভার করা হয়েছে।

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

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

,

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

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

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

ওভারভিউ

একটি WorkRequest মাধ্যমে WorkManager-এ কাজ সংজ্ঞায়িত করা হয়। WorkManager-এর সাথে যেকোনো কাজের সময়সূচী করার জন্য আপনাকে প্রথমে একটি WorkRequest অবজেক্ট তৈরি করতে হবে এবং তারপর সারিবদ্ধ করতে হবে।

কোটলিন

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

জাভা

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

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

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

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

ওয়ার্কম্যানেজার 2.7.0 তাত্ক্ষণিক কাজের ধারণাটি প্রবর্তন করে। এটি সিস্টেমকে সংস্থানগুলিতে অ্যাক্সেসের উপর আরও ভাল নিয়ন্ত্রণ দেওয়ার সময় ওয়ার্কম্যানেজারকে গুরুত্বপূর্ণ কাজ সম্পাদন করতে দেয়।

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

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

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

কোটা

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

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

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

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

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

কোটলিন

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

WorkManager.getInstance(context)
    .enqueue(request)

জাভা

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

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

পিছনের সামঞ্জস্যতা এবং অগ্রভাগের পরিষেবাগুলি

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

আপনার কর্মীর মধ্যে getForegroundInfoAsync() এবং getForegroundInfo() পদ্ধতিগুলি ওয়ার্কম্যানেজারকে অ্যান্ড্রয়েড 12 এর পূর্বে setExpedited() কল করার সময় একটি বিজ্ঞপ্তি প্রদর্শন করতে সক্ষম করে।

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

অ্যান্ড্রয়েড 12 বা উচ্চতর টার্গেট করার সময়, অগ্রভাগের পরিষেবাগুলি সম্পর্কিত setForeground পদ্ধতির মাধ্যমে আপনার কাছে উপলব্ধ থাকে।

কর্মী

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

এটি সক্ষম করার জন্য, ওয়ার্কম্যানেজার getForegroundInfoAsync() পদ্ধতি সরবরাহ করে, যা আপনাকে অবশ্যই প্রয়োগ করতে হবে যাতে ওয়ার্কম্যানেজার আপনার জন্য যেখানে প্রয়োজন সেখানে একটি ForegroundService শুরু করার জন্য একটি বিজ্ঞপ্তি প্রদর্শন করতে পারে।

করুটাইন ওয়ার্কার

আপনি যদি কোনও CoroutineWorker ব্যবহার করেন তবে আপনাকে অবশ্যই getForegroundInfo() প্রয়োগ করতে হবে। তারপরে আপনি এটি doWork() মধ্যে setForeground() এ পাস করুন। এটি করা 12 এর আগে অ্যান্ড্রয়েডের সংস্করণগুলিতে বিজ্ঞপ্তি তৈরি করবে।

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

  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 , যা পর্যাপ্ত কোটা না থাকলে অনুরোধ বাতিল করার কারণ করে।

নমুনা অ্যাপ

ওয়ার্কম্যানেজার ২.7.০ কীভাবে তাত্ক্ষণিক কাজ ব্যবহার করে তার একটি সম্পূর্ণ উদাহরণ দেখতে, গিটহাবের ওয়ার্কম্যানেজারদের নমুনা দেখুন।

স্থগিত তাত্ক্ষণিক কাজ

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

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

পর্যায়ক্রমিক কাজ সময়সূচী

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

আপনি কীভাবে পর্যায়ক্রমিকভাবে সম্পাদন করে এমন একটি WorkRequest অবজেক্ট তৈরি করতে PeriodicWorkRequest ব্যবহার করেন তা এখানে:

কোটলিন

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

জাভা

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

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

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

নমনীয় রান অন্তর

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

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

চিত্র 1। ডায়াগ্রামটি নমনীয় সময়ের সাথে পুনরাবৃত্তি অন্তরগুলি দেখায় যেখানে কাজটি চালাতে পারে।

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

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

কোটলিন

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_FLEX_MILLIS PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS চেয়ে বড় বা সমান হতে হবে min

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

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

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

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

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

সীমাবদ্ধতার একটি সেট তৈরি করতে এবং এটিকে কিছু কাজের সাথে যুক্ত করতে, Contraints.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();

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

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

বিলম্বিত কাজ

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

আপনার কাজটি কীভাবে এনকিউড হওয়ার কমপক্ষে 10 মিনিট পরে চালানোর জন্য সেট করতে হবে তার একটি উদাহরণ এখানে।

কোটলিন

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

জাভা

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

উদাহরণটি কীভাবে OneTimeWorkRequest জন্য প্রাথমিক বিলম্ব সেট করতে পারে তা চিত্রিত করে, আপনি PeriodicWorkRequest জন্য প্রাথমিক বিলম্বও সেট করতে পারেন। সেক্ষেত্রে আপনার পর্যায়ক্রমিক কাজের প্রথম রানটি বিলম্বিত হবে।

পুনরায় চেষ্টা করুন এবং ব্যাকঅফ নীতি

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

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

  • ব্যাকঅফ নীতি নির্ধারণ করে যে কীভাবে পরবর্তী পুনরায় চেষ্টা করার জন্য সময়ের সাথে সাথে ব্যাক অফের বিলম্ব বাড়ানো উচিত। ওয়ার্কম্যানেজার 2 টি ব্যাক অফ নীতি, LINEAR এবং EXPONENTIAL সমর্থন করে।

প্রতিটি কাজের অনুরোধে ব্যাক অফ নীতি এবং ব্যাকওফ বিলম্ব থাকে। ডিফল্ট নীতিটি 30 সেকেন্ডের বিলম্বের সাথে EXPONENTIAL , তবে আপনি এটি আপনার কাজের অনুরোধ কনফিগারেশনে ওভাররাইড করতে পারেন।

ব্যাক অফ বিলম্ব এবং নীতি কাস্টমাইজ করার একটি উদাহরণ এখানে।

কোটলিন

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

জাভা

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

এই উদাহরণে, ন্যূনতম ব্যাক অফ বিলম্বটি ন্যূনতম অনুমোদিত মান, 10 সেকেন্ডে সেট করা আছে। যেহেতু নীতিটি LINEAR তাই পুনরায় চেষ্টা ব্যবধান প্রতিটি নতুন প্রচেষ্টার সাথে প্রায় 10 সেকেন্ড বৃদ্ধি পাবে। উদাহরণস্বরূপ, Result.retry() সাথে প্রথম রান সমাপ্তি Result.retry() যদি ব্যাকঅফ নীতিটি EXPONENTIAL সেট করা থাকে তবে পুনরায় চেষ্টা করার সময়কাল ক্রমটি 20, 40, 80 এবং এর কাছাকাছি হবে।

ট্যাগ কাজ

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

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

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

নিম্নলিখিত কোডটি দেখায় যে কীভাবে আপনি আপনার কাজে একটি "ক্লিনআপ" ট্যাগ যুক্ত করতে পারেন:

কোটলিন

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

জাভা

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

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

আপনার Worker শ্রেণি থেকে, আপনি শ্রবণযোগ্য কর্মী.জেট ট্যাগ () এর মাধ্যমে এর ট্যাগগুলির সেটটি পুনরুদ্ধার করতে পারেন।

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

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

ইনপুট মানগুলি কোনও Data অবজেক্টে কী-মান জোড়া হিসাবে সংরক্ষণ করা হয় এবং কাজের অনুরোধে সেট করা যেতে পারে। ওয়ার্কম্যানেজার যখন কাজটি কার্যকর করে তখন আপনার কাজের ইনপুট 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 ক্লাসটি রিটার্ন মান আউটপুট করতে ব্যবহার করা যেতে পারে। ইনপুট এবং আউটপুট ডেটা বিভাগের ইনপুট পরামিতি এবং ফিরে আসা মানগুলিতে আরও বিশদে আচ্ছাদিত থাকে।

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

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