ওয়ার্কারে থ্রেডিং

আপনি Worker ব্যবহার করলে, WorkManager ব্যাকগ্রাউন্ড থ্রেডে অটোমেটিক Worker.doWork() কল করে। ব্যাকগ্রাউন্ড থ্রেডটি WorkManager-এর Configuration-এ উল্লেখ করা Executor থেকে আসে। ডিফল্ট হিসেবে, WorkManager আপনার জন্য একটি Executor সেট-আপ করে—তবে আপনি নিজের মতো করে কাস্টমাইজও করতে পারেন। যেমন, আপনার অ্যাপে আগে থেকে থাকা ব্যাকগ্রাউন্ড Executor শেয়ার করতে, সিঙ্গেল-থ্রেডেড Executor তৈরি করতে পারেন যাতে আপনার সব ব্যাকগ্রাউন্ড কাজ পরপর এক্সিকিউট হয় তা নিশ্চিত করা যায় অথবা কাস্টম Executor নির্দিষ্ট করতে পারেন। Executor কাস্টমাইজ করতে, আপনি ম্যানুয়ালি WorkManager শুরু করেছেন কিনা তা নিশ্চিত করুন।

WorkManager ম্যানুয়ালি কনফিগার করার সময়, আপনি নিজের Executor এইভাবে উল্লেখ করতে পারবেন:

Kotlin

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-এর উদাহরণ দেওয়া হল যা কোনও ওয়েবপেজের কন্টেন্ট ১০০ বার ডাউনলোড করে:

Kotlin

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 বন্ধ করা হলে, এটি আইটেম ডাউনলোড করার লুপের মাঝখানে থাকতে পারে এবং বন্ধ করা হলেও এটি তা চালিয়ে যাবে। এই আচরণ অপ্টিমাইজ করতে, আপনি এই ধরনের কিছু করতে পারেন:

Kotlin

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 উপেক্ষা করা হবে।