क्या आप अभी भी अपने Android ऐप्स में AsyncTask का उपयोग कर रहे हैं? आपको शायद अब और नहीं रहना चाहिए। यहां बताया गया है कि इन्हें कोटलिन के कॉरआउटिंस से कैसे बदला जाए।
एंड्रॉइड में बहुत लंबे समय तक, यदि आपको ऐप बनाते समय एसिंक्रोनस रूप से कुछ भी करने की आवश्यकता होती है, तो आप शायद AsyncTask का उपयोग कर रहे होंगे। AsyncTask एंड्रॉइड के ढांचे में एक एपीआई है जो पृष्ठभूमि में संचालन चलाने और समाप्त होने पर मान वापस करना आसान (ईश) बनाता है। और यह समझ में आता है. कोटलिन के कॉरआउट्स के विपरीत, AsyncTask कुछ समय से मौजूद है, और इसे सही तरीके से बनाया गया है।
हालाँकि, पिछले कुछ वर्षों में AsyncTask का डिज़ाइन दर्शन और कार्यान्वयन दोनों ही कुछ पुराने हो गए हैं। उसके कारण, Google के पास है AsyncTask API को अस्वीकृत कर दिया गया. यदि आप चाहें तो आप अभी भी इसका उपयोग कर सकते हैं, लेकिन Google ऐसा करने की अनुशंसा नहीं करता है। सौभाग्य से, AsyncTask के विकल्पों का एक पूरा समूह मौजूद है, जिसमें कोटलिन भाषा की एक विशेषता - कॉरआउट्स भी शामिल है।
कोटलिन का कोरआउटिंस एपीआई एक अविश्वसनीय रूप से शक्तिशाली ढांचा है जो आपको कई चीजें करने की सुविधा देता है। यह आलेख केवल उस सतह को खरोंचने वाला है जो संभव है। हम AsyncTask से coroutines पर माइग्रेट करने के लिए आवश्यक बुनियादी बातों पर चर्चा करेंगे।
Coroutines समर्थन जोड़ा जा रहा है
इससे पहले कि आप कोरआउटिन का उपयोग शुरू कर सकें, आपको वास्तव में उन्हें अपने प्रोजेक्ट में जोड़ना होगा।
कोटलिन समर्थन जोड़ा जा रहा है
यदि आपने पहले ही कोटलिन लागू कर लिया है, तो अगले भाग पर जाएँ। अन्यथा, आपको अपने प्रोजेक्ट में कोटलिन समर्थन जोड़ना होगा। अधिक विवरण के लिए किसी मौजूदा प्रोजेक्ट में कोटलिन को जोड़ने पर मेरा ट्यूटोरियल देखें।
कॉरआउटिन लाइब्रेरीज़ जोड़ना
आपके मॉड्यूल-स्तर पर build.gradle
, निम्नलिखित निर्भरताएँ शामिल करें।
dependencies {
...
implementation 'org.jetbrains.kotlinx: kotlinx-coroutines-core: 1.5.0'
implementation 'org.jetbrains.kotlinx: kotlinx-coroutines-android: 1.5.0'
}
अपने प्रोजेक्ट को सिंक करें, और कोटलिन के कोरआउट्स अब उपयोग के लिए उपलब्ध होंगे।
कॉरआउटिंस का उपयोग करना
CoroutineScope को कार्यान्वित करना
coroutines का उपयोग करने के लिए, आपके पास CoroutineScope इंस्टेंस उपलब्ध होना आवश्यक है। ऐसा करने का एक आसान तरीका यह है कि इसे अपनी युक्त कक्षा में लागू करें।
उदाहरण के लिए, किसी गतिविधि में CoroutineScope लागू करने के लिए:
classSomeActivity : AppCompatActivity, CoroutineScope by MainScope() {
...
override fun onDestroy(){
super.onDestroy()
cancel()
}
}
यह SomActivity को MainScope क्लास के माध्यम से CoroutineScope इंटरफ़ेस को लागू करने में सक्षम बनाएगा। MainScope आपको CoroutineScope विधियों का उपयोग करने की अनुमति देते हुए, CoroutineScope के लिए सभी कार्यान्वयन तर्क को संभालेगा। कॉलिंग cancel()
में onDestroy()
यह सुनिश्चित करता है कि गतिविधि समाप्त होने के बाद कोई अतुल्यकालिक तर्क चलता रहे।
AsyncTask को Coroutines से बदलना
मान लें कि आपके पास एक गतिविधि के अंदर एक AsyncTask है जो पृष्ठभूमि में लंबे समय तक चलने वाला ऑपरेशन करता है और अंततः एक स्ट्रिंग लौटाता है। निम्नलिखित जैसा कुछ।
private inner classSomeTask : AsyncTask
() {
override fun doInBackground(vararg params: Void): String {
try {
//Pretend this is an actual operation that takes 10 seconds and not just sleeping.
Thread.sleep(10000);
} catch (e: InterruptedException) {}
return"SomeString";
}
override fun onPostExecute(result: String) {
val someTextView = findViewById(R.id.some_text_view)
someTextView.text = result
}
}
इसे कॉरआउटिन से बदलना आसान है। बस उपयोग करें async()
तरीका। कोटलिन का async()
यह जिस भी थ्रेड पर लॉन्च किया गया था, उस पर चलता है, लेकिन यह एसिंक्रोनस रूप से करता है। इसका मतलब है कि आप सही थ्रेड का उपयोग करने की चिंता किए बिना व्यू आदि को अपडेट कर सकते हैं।
classSomeActivity : AppCompatActivity(), CoroutineScope by MainScope() {
...private fun doOperation(){
async {
//Inside coroutine scopes (like inside async here), delay is used instead of Thread.sleep.
delay(10000)
val someTextView = findViewById(R.id.some_text_view)
someTextView.text = "SomeString"
}
}
}
जैसा कि आप देख सकते हैं, AsyncTask का उपयोग करने की तुलना में coroutines का उपयोग करना बहुत आसान हो सकता है। आपको सिर्फ कॉल करने की जरूरत नहीं है async()
हालाँकि, इसे अपना काम करने दें। आप इसका संदर्भ अपने पास रख सकते हैं और इसके ख़त्म होने तक प्रतीक्षा भी कर सकते हैं।
val asyncJob = async {
//Some operation
}
//Pause here until the async block is finished.
asyncJob.await()
//This won't run until asyncJob finishes, but other operations started before the job, or started from another method, can still run.
doSomethingElse()
Async के साथ मान लौटाना
आप इससे कोई मान भी वापस कर सकते हैं async()
अगर आप चाहते हैं। तो मूल उदाहरण कुछ इस तरह बन सकता है.
classSomeActivity : AppCompatActivity(), CoroutineScope by MainScope() {
...
private fun doOperation(){
val asyncJob = async {
//Inside coroutine scopes (like inside async here), delay is used instead of Thread.sleep.
delay(10000)//Whatever the type is of the last line is what async() eventually returns.
"SomeString"
}val result = asyncJob.await()
val someTextView = findViewById(R.id.some_text_view)
someTextView.text = result
}
}
withContext का उपयोग करना
सुविधा के लिए, कोटलिन प्रदान करता है withContext()
. यह संपूर्ण को रेखांकित करता है await()
चीज़ और बस आपको मान लौटा देता है।
classSomeActivity : AppCompatActivity(), CoroutineScope by MainScope() {
...
private fun doOperation(){
//Run asynchronously on the main Thread.
val result = withContext(Dispatchers.Main) {
delay(10000)"SomeResult"
}
val someTextView = findViewById(R.id.some_text_view)
someTextView.text = result
}
}
निष्कर्ष
ऊपर दिए गए उदाहरण आपको आरंभ करने के लिए कोटलिन के कोरआउट्स के कुछ बुनियादी उपयोग हैं। आपको कोरआउट्स को गतिविधियों या उचित जीवनचक्र वाली किसी भी चीज़ तक सीमित रखने की ज़रूरत नहीं है। आप इन्हें मूल रूप से कहीं भी चला सकते हैं। अधिक उन्नत ऑपरेशन भी हैं, जैसे यह चुनना कि किस थ्रेड को एसिंक्रोनस लॉजिक चलाना चाहिए। यह मार्गदर्शिका मुख्य रूप से यह दिखाने के लिए है कि एक साधारण AsyncTask को एक साधारण कोरआउटिन से कैसे बदला जाए।
कॉरआउट्स कैसे काम करते हैं, और आप उनकी अधिक उन्नत सुविधाओं का उपयोग कैसे कर सकते हैं, इसके बारे में अधिक जानकारी के लिए देखें आधिकारिक कोटलिन दस्तावेज़ीकरण.