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>