سلسلة محادثات في العامل
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
عند استخدام Worker
، WorkManager
يتصل تلقائيًا بـ Worker.doWork()
في سلسلة محادثات في الخلفية. تأتي سلسلة المحادثات في الخلفية من Executor
.
المحددة في Configuration
في WorkManager.
يُعِد WorkManager تلقائيًا 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())
Java
WorkManager.initialize(
context,
new Configuration.Builder()
.setExecutor(Executors.newFixedThreadPool(8))
.build());
في ما يلي مثال على Worker
بسيط ينزِّل محتوى صفحة ويب
100 مرة:
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()
}
}
Java
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()
وتعرض Result
، قد لا يتم معاودة الاتصال
لا تعمل بشكل صحيح. إذا وجدت نفسك في هذا الموقف، ننصحك باستخدام ListenableWorker
(راجِع Threading في 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()
}
}
Java
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
.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],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."]]