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

بالنسبة إلى مستخدمي 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>

نماذج