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>