ওয়ার্কারে থ্রেডিং
সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন
আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।
আপনি যখন একজন 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
উপেক্ষা করা হবে.
এই পৃষ্ঠার কন্টেন্ট ও কোডের নমুনাগুলি Content License-এ বর্ণিত লাইসেন্সের অধীনস্থ। Java এবং OpenJDK হল Oracle এবং/অথবা তার অ্যাফিলিয়েট সংস্থার রেজিস্টার্ড ট্রেডমার্ক।
2025-07-29 UTC-তে শেষবার আপডেট করা হয়েছে।
[null,null,["2025-07-29 UTC-তে শেষবার আপডেট করা হয়েছে।"],[],[],null,["# Threading in Worker\n\nWhen you use a [`Worker`](/reference/androidx/work/Worker), WorkManager\nautomatically calls [`Worker.doWork()`](/reference/androidx/work/Worker#doWork())\non a background thread. The background thread comes from the `Executor`\nspecified in WorkManager's [`Configuration`](/reference/androidx/work/Configuration).\nBy default, WorkManager sets up an `Executor` for you---but you can also customize\nyour own. For example, you can share an existing background Executor in your\napp, create a single-threaded `Executor` to make sure all your background work\nexecutes sequentially, or even specify a custom `Executor`. To customize the\n`Executor`, make sure you initialize WorkManager manually.\n\nWhen configuring WorkManager manually, you can specify your `Executor` as\nfollows: \n\n### Kotlin\n\n```kotlin\nWorkManager.initialize(\n context,\n Configuration.Builder()\n // Uses a fixed thread pool of size 8 threads.\n .setExecutor(Executors.newFixedThreadPool(8))\n .build())\n```\n\n### Java\n\n```java\nWorkManager.initialize(\n context,\n new Configuration.Builder()\n .setExecutor(Executors.newFixedThreadPool(8))\n .build());\n```\n\nHere is an example of a simple `Worker` that downloads the contents of a webpage\n100 times: \n\n### Kotlin\n\n```kotlin\nclass DownloadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {\n\n override fun doWork(): ListenableWorker.Result {\n repeat(100) {\n try {\n downloadSynchronously(\"https://www.google.com\")\n } catch (e: IOException) {\n return ListenableWorker.Result.failure()\n }\n }\n\n return ListenableWorker.Result.success()\n }\n}\n```\n\n### Java\n\n```java\npublic class DownloadWorker extends Worker {\n\n public DownloadWorker(Context context, WorkerParameters params) {\n super(context, params);\n }\n\n @NonNull\n @Override\n public Result doWork() {\n for (int i = 0; i \u003c 100; i++) {\n try {\n downloadSynchronously(\"https://www.google.com\");\n } catch (IOException e) {\n return Result.failure();\n }\n }\n\n return Result.success();\n }\n\n}\n```\n\nNote that [`Worker.doWork()`](/reference/androidx/work/Worker#doWork()) is a\nsynchronous call---you are expected to do the entirety of your background work in\na blocking fashion and finish it by the time the method exits. If you call an\nasynchronous API in `doWork()` and return a [`Result`](/reference/androidx/work/ListenableWorker.Result), your callback may not\noperate properly. If you find yourself in this situation, consider using a [`ListenableWorker`](/reference/androidx/work/ListenableWorker) (see [Threading in ListenableWorker](/topic/libraries/architecture/workmanager/advanced/listenableworker)).\n\nWhen a currently running `Worker` is [stopped for any reason](/topic/libraries/architecture/workmanager/how-to/managing-work#cancelling), it\nreceives a call to [`Worker.onStopped()`](/reference/androidx/work/ListenableWorker#onStopped()). Override this method or\ncall [`Worker.isStopped()`](/reference/androidx/work/ListenableWorker#isStopped())\nto checkpoint your code and free up resources when necessary. When the `Worker`\nin the example above is stopped, it may be in the middle of its loop of\ndownloading items and will continue doing so even though it has been stopped. To\noptimize this behavior, you can do something like this: \n\n### Kotlin\n\n```kotlin\nclass DownloadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {\n\n override fun doWork(): ListenableWorker.Result {\n repeat(100) {\n if (isStopped) {\n break\n }\n\n try {\n downloadSynchronously(\"https://www.google.com\")\n } catch (e: IOException) {\n return ListenableWorker.Result.failure()\n }\n\n }\n\n return ListenableWorker.Result.success()\n }\n}\n```\n\n### Java\n\n```java\npublic class DownloadWorker extends Worker {\n\n public DownloadWorker(Context context, WorkerParameters params) {\n super(context, params);\n }\n\n @NonNull\n @Override\n public Result doWork() {\n for (int i = 0; i \u003c 100; ++i) {\n if (isStopped()) {\n break;\n }\n\n try {\n downloadSynchronously(\"https://www.google.com\");\n } catch (IOException e) {\n return Result.failure();\n }\n }\n\n return Result.success();\n }\n}\n```\n\nOnce a `Worker` has been stopped, it doesn't matter what you return from\n`Worker.doWork()`; the `Result` will be ignored."]]