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

عند استخدام 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.