שרשור ב-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.