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