بالنسبة إلى مستخدمي Kotlin، يوفر WorkManager دعمًا من الدرجة الأولى لـ الكوروتينات. للحصول على
البدء، يُرجى تضمين work-runtime-ktx
في ملف Gradle. بدلاً من تمديد الفترة Worker
، عليك تمديد الفترة CoroutineWorker
التي تشمل حالة تعليق.
إصدار doWork()
. على سبيل المثال، إذا أردت إنشاء CoroutineWorker
بسيط
لإجراء بعض عمليات الشبكة، يمكنك إجراء ما يلي:
class CoroutineDownloadWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
val data = downloadSynchronously("https://www.google.com")
saveData(data)
return Result.success()
}
}
يُرجى العِلم أنّ CoroutineWorker.doWork()
معلّقة.
الأخرى. على عكس Worker
، لا يتم تشغيل هذا الرمز على Executor
المحدد
في Configuration
بدلاً من ذلك،
يتم ضبط القيمة التلقائية على Dispatchers.Default
. يمكنك تخصيص هذا من خلال تقديم CoroutineContext
الخاص بك. في المثال أعلاه، ننصحك بتنفيذ هذا الإجراء على Dispatchers.IO
، كما يلي:
class CoroutineDownloadWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
withContext(Dispatchers.IO) {
val data = downloadSynchronously("https://www.google.com")
saveData(data)
return Result.success()
}
}
}
يعالج CoroutineWorker
طلبات الإيقاف تلقائيًا من خلال إلغاء الكوروتين.
ونشر إشارات الإلغاء. لست بحاجة إلى اتخاذ أي إجراء خاص.
للتعامل مع توقفات العمل.
تشغيل CoroutineWorker في عملية مختلفة
يمكنك أيضًا ربط عامل بعملية معينة باستخدام
RemoteCoroutineWorker
،
تنفيذ ListenableWorker
.
ترتبط RemoteCoroutineWorker
بعملية محدّدة باستخدام وسيطتين إضافيتين.
التي تقدمها كجزء من بيانات الإدخال عند إنشاء طلب العمل:
ARGUMENT_CLASS_NAME
وARGUMENT_PACKAGE_NAME
يوضح المثال التالي إنشاء طلب عمل يقتصر على عملية محددة:
Kotlin
val PACKAGE_NAME = "com.example.background.multiprocess" val serviceName = RemoteWorkerService::class.java.name val componentName = ComponentName(PACKAGE_NAME, serviceName) val data: Data = Data.Builder() .putString(ARGUMENT_PACKAGE_NAME, componentName.packageName) .putString(ARGUMENT_CLASS_NAME, componentName.className) .build() return OneTimeWorkRequest.Builder(ExampleRemoteCoroutineWorker::class.java) .setInputData(data) .build()
Java
String PACKAGE_NAME = "com.example.background.multiprocess"; String serviceName = RemoteWorkerService.class.getName(); ComponentName componentName = new ComponentName(PACKAGE_NAME, serviceName); Data data = new Data.Builder() .putString(ARGUMENT_PACKAGE_NAME, componentName.getPackageName()) .putString(ARGUMENT_CLASS_NAME, componentName.getClassName()) .build(); return new OneTimeWorkRequest.Builder(ExampleRemoteCoroutineWorker.class) .setInputData(data) .build();
عليك أيضًا إضافة تعريف خدمة لكل RemoteWorkerService
.
ملف AndroidManifest.xml
:
<manifest ... > <service android:name="androidx.work.multiprocess.RemoteWorkerService" android:exported="false" android:process=":worker1" /> <service android:name=".RemoteWorkerService2" android:exported="false" android:process=":worker2" /> ... </manifest>