আপনি যখন একজন Worker
ব্যবহার করেন, WorkManager স্বয়ংক্রিয়ভাবে Worker.doWork()
একটি ব্যাকগ্রাউন্ড থ্রেডে কল করে। ব্যাকগ্রাউন্ড থ্রেডটি WorkManager-এর Configuration
নির্দিষ্ট করা Executor
থেকে আসে। ডিফল্টরূপে, WorkManager আপনার জন্য একটি Executor
সেট আপ করে—কিন্তু আপনি নিজের কাস্টমাইজও করতে পারেন। উদাহরণস্বরূপ, আপনি আপনার অ্যাপে একটি বিদ্যমান ব্যাকগ্রাউন্ড এক্সিকিউটর শেয়ার করতে পারেন, আপনার সমস্ত ব্যাকগ্রাউন্ডের কাজ ক্রমানুসারে কার্যকর হয় তা নিশ্চিত করতে একটি একক-থ্রেডেড Executor
তৈরি করতে পারেন, বা এমনকি একটি কাস্টম Executor
নির্দিষ্ট করতে পারেন। Executor
কাস্টমাইজ করতে, নিশ্চিত করুন যে আপনি ওয়ার্ক ম্যানেজার ম্যানুয়ালি শুরু করেছেন।
ওয়ার্ক ম্যানেজার ম্যানুয়ালি কনফিগার করার সময়, আপনি আপনার Executor
নিম্নরূপ উল্লেখ করতে পারেন:
কোটলিন
WorkManager.initialize( context, Configuration.Builder() // Uses a fixed thread pool of size 8 threads. .setExecutor(Executors.newFixedThreadPool(8)) .build())
জাভা
WorkManager.initialize( context, new Configuration.Builder() .setExecutor(Executors.newFixedThreadPool(8)) .build());
এখানে একটি সাধারণ Worker
একটি উদাহরণ রয়েছে যা একটি ওয়েবপৃষ্ঠার বিষয়বস্তু 100 বার ডাউনলোড করে:
কোটলিন
class DownloadWorker(context: Context, params: WorkerParameters) : Worker(context, params) { override fun doWork(): ListenableWorker.Result { repeat(100) { try { downloadSynchronously("https://www.google.com") } catch (e: IOException) { return ListenableWorker.Result.failure() } } return ListenableWorker.Result.success() } }
জাভা
public class DownloadWorker extends Worker { public DownloadWorker(Context context, WorkerParameters params) { super(context, params); } @NonNull @Override public Result doWork() { for (int i = 0; i < 100; i++) { try { downloadSynchronously("https://www.google.com"); } catch (IOException e) { return Result.failure(); } } return Result.success(); } }
মনে রাখবেন Worker.doWork()
হল একটি সিঙ্ক্রোনাস কল—আপনি আপনার ব্যাকগ্রাউন্ডের সম্পূর্ণ কাজটি ব্লকিং পদ্ধতিতে করবেন এবং পদ্ধতিটি প্রস্থান করার সময় এটি শেষ করবেন বলে আশা করা হচ্ছে। আপনি doWork()
এ একটি অ্যাসিঙ্ক্রোনাস API কল করলে এবং একটি Result
ফেরত দিলে, আপনার কলব্যাক সঠিকভাবে কাজ নাও করতে পারে। আপনি যদি নিজেকে এই পরিস্থিতিতে খুঁজে পান, তাহলে ListenableWorker
ব্যবহার করার কথা বিবেচনা করুন ( ListenableWorker-এ থ্রেডিং দেখুন)।
যখন একটি বর্তমানে চলমান Worker
কোনো কারণে বন্ধ করা হয়, তখন এটি Worker.onStopped()
এ একটি কল পায়। এই পদ্ধতিটি ওভাররাইড করুন বা আপনার কোড চেকপয়েন্ট করতে Worker.isStopped()
কল করুন এবং প্রয়োজনে সংস্থানগুলি খালি করুন৷ যখন উপরের উদাহরণে Worker
থামানো হয়, তখন এটি আইটেম ডাউনলোড করার লুপের মাঝখানে থাকতে পারে এবং এটি বন্ধ করা হলেও এটি চালিয়ে যাবে। এই আচরণ অপ্টিমাইজ করতে, আপনি এই মত কিছু করতে পারেন:
কোটলিন
class DownloadWorker(context: Context, params: WorkerParameters) : Worker(context, params) { override fun doWork(): ListenableWorker.Result { repeat(100) { if (isStopped) { break } try { downloadSynchronously("https://www.google.com") } catch (e: IOException) { return ListenableWorker.Result.failure() } } return ListenableWorker.Result.success() } }
জাভা
public class DownloadWorker extends Worker { public DownloadWorker(Context context, WorkerParameters params) { super(context, params); } @NonNull @Override public Result doWork() { for (int i = 0; i < 100; ++i) { if (isStopped()) { break; } try { downloadSynchronously("https://www.google.com"); } catch (IOException e) { return Result.failure(); } } return Result.success(); } }
একবার একজন Worker
থামিয়ে দিলে, আপনি Worker.doWork()
থেকে কী ফেরত দেন তাতে কিছু যায় আসে না; Result
উপেক্ষা করা হবে.