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

Kotlin के उपयोगकर्ताओं के लिए, WorkManager कोरूटीन के लिए बेहतरीन सहायता देता है. पाने के लिए शुरू किया गया है, तो 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 के उलट, यह कोड बताए गए 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>

सैंपल