Threading در Worker
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
وقتی از Worker
استفاده می کنید، WorkManager به طور خودکار Worker.doWork()
در یک رشته پس زمینه فراخوانی می کند. رشته پس زمینه از Executor
مشخص شده در WorkManager's Configuration
می آید. بهطور پیشفرض، WorkManager یک Executor
را برای شما تنظیم میکند — اما میتوانید برنامه خود را نیز سفارشی کنید. برای مثال، میتوانید یک اجراکننده پسزمینه موجود را در برنامه خود به اشتراک بگذارید، یک Executor
تک رشتهای ایجاد کنید تا مطمئن شوید که تمام کارهای پسزمینه شما به صورت متوالی اجرا میشوند، یا حتی یک Executor
سفارشی را مشخص کنید. برای سفارشی کردن Executor
، مطمئن شوید که WorkManager را به صورت دستی مقداردهی اولیه کنید.
هنگام پیکربندی WorkManager به صورت دستی، می توانید 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()
یک فراخوانی همزمان است—از شما انتظار میرود که کل کار پسزمینه خود را به صورت مسدود انجام دهید و تا زمان خروج از متد آن را به پایان برسانید. اگر یک API ناهمزمان را در doWork()
فراخوانی کنید و یک Result
برگردانید، ممکن است پاسخ تماس شما به درستی کار نکند. اگر در این موقعیت قرار گرفتید، از ListenableWorker
استفاده کنید (به Threading در 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
نادیده گرفته خواهد شد.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[null,null,["تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی."],[],[],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."]]