CoroutineWorker में थ्रेडिंग

Kotlin इस्तेमाल करने वाले लोगों के लिए, WorkManager कोरूटीन के लिए बेहतरीन सहायता उपलब्ध कराता है. शुरू करने के लिए, अपनी Gradle फ़ाइल में work-runtime-ktx शामिल करें. 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 के उलट, यह कोड आपके Configuration में बताए गए Executor पर नहीं चलता. इसके बजाय, यह डिफ़ॉल्ट रूप से 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 को चलाना

ListenableWorker को लागू करने वाले RemoteCoroutineWorker का इस्तेमाल करके, किसी वर्कर्स को किसी खास प्रोसेस से भी जोड़ा जा सकता है.

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>