سلسلة محادثات في العامل

عند استخدام Worker، يستدعي WorkManager تلقائيًا Worker.doWork() في سلسلة محادثات في الخلفية. إنّ سلسلة الخلفية هي من Executor المحدّدة في Configuration من WorkManager. يتولّى تطبيق WorkManager تلقائيًا إعداد Executor نيابةً عنك، ولكن يمكنك أيضًا تخصيص عنوان URL الخاص بك. على سبيل المثال، يمكنك مشاركة أداة تنفيذ حالية للخلفية في تطبيقك، أو إنشاء 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 in 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.