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