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

শুরু করার নির্দেশিকাটিতে কীভাবে একটি WorkRequest তৈরি করতে হয় এবং এটিকে সারিবদ্ধ করতে হয় তা আলোচনা করা হয়েছে।

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

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

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

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

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

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

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

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

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

কর্মী

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

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

CoroutineWorker সম্পর্কে

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

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

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

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

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

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

এখানে আপনি 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 প্রতিটি চক্রের ফ্লেক্স ব্যবধানের সময় কোনও এক সময়ে আপনার কাজ চালানোর চেষ্টা করে।

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

পর্যায়ক্রমিক কাজকে ফ্লেক্স পিরিয়ড দিয়ে সংজ্ঞায়িত করতে, PeriodicWorkRequest তৈরি করার সময় আপনাকে repeatInterval এর সাথে একটি flexInterval পাস করতে হবে। flex পিরিয়ড 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-এর জন্য উপলব্ধ:

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

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

বিলম্বিত কাজ

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

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

কোটলিন

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() ফেরত দিতে পারেন। এরপর আপনার কাজটি একটি ব্যাকঅফ বিলম্ব এবং ব্যাকঅফ নীতি অনুসারে পুনঃনির্ধারিত করা হয়।

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

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

প্রতিটি কাজের অনুরোধের একটি ব্যাকঅফ নীতি এবং ব্যাকঅফ বিলম্ব থাকে। ডিফল্ট নীতিটি 30 সেকেন্ড বিলম্বের সাথে 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 অবজেক্টের একটি তালিকা প্রদান করে যা বর্তমান কাজের অবস্থা নির্ধারণ করতে ব্যবহার করা যেতে পারে।

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

কোটলিন

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 অবজেক্টে key-value জোড়া হিসেবে সংরক্ষণ করা হয় এবং কাজের অনুরোধে সেট করা যেতে পারে। 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 ক্লাস ব্যবহার করতে পারেন।

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

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