שרשור ב-Worker
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
כשמשתמשים ב-Worker
, WorkManager
שיחות אוטומטיות ל-Worker.doWork()
בשרשור שנמצא ברקע. שרשור הרקע מגיע מ-Executor
צוין ב-Configuration
של WorkManager.
כברירת מחדל, ב-Work Manager מוגדר 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()
הוא
שיחה סנכרונית — אתם אמורים לבצע את כל העבודה ברקע
שיטת חסימה ומסיימים אותה עד למועד היציאה של השיטה. אם מתקשרים
API אסינכרוני ב-doWork()
ויחזיר 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()
}
}
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 (שעון UTC).
[[["התוכן קל להבנה","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 (שעון 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."]]