כשמשתמשים ב-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
.