Android Kotlin Fundamentals 08.1: Getting data from the internet

यह कोडलैब, Android Kotlin Fundamentals कोर्स का हिस्सा है. अगर कोडलैब को क्रम से पूरा किया जाता है, तो आपको इस कोर्स से सबसे ज़्यादा फ़ायदा मिलेगा. कोर्स के सभी कोडलैब, Android Kotlin Fundamentals कोडलैब के लैंडिंग पेज पर दिए गए हैं.

शुरुआती जानकारी

बनाए गए लगभग हर Android ऐप्लिकेशन को किसी न किसी समय इंटरनेट से कनेक्ट करने की ज़रूरत होती है. इस कोडलैब और इसके बाद के कोडलैब में, आपको एक ऐसा ऐप्लिकेशन बनाने का तरीका बताया जाएगा जो डेटा को वापस पाने और उसे दिखाने के लिए, वेब सेवा से कनेक्ट होता है. साथ ही, आपको ViewModel, LiveData, और RecyclerView के बारे में पिछले कोडलैब में सीखी गई बातों को आगे बढ़ाने का मौका मिलेगा.

इस कोडलैब में, नेटवर्क लेयर बनाने के लिए कम्यूनिटी की ओर से डेवलप की गई लाइब्रेरी का इस्तेमाल किया जाता है. इससे डेटा और इमेज को फ़ेच करना बहुत आसान हो जाता है. साथ ही, इससे ऐप्लिकेशन को Android के कुछ सबसे सही तरीकों का पालन करने में मदद मिलती है. जैसे, बैकग्राउंड थ्रेड पर इमेज लोड करना और लोड की गई इमेज को कैश मेमोरी में सेव करना. कोड में एसिंक्रोनस या नॉन-ब्लॉकिंग सेक्शन के लिए, जैसे कि वेब सेवाओं की लेयर से कम्यूनिकेट करने के लिए, आपको ऐप्लिकेशन में बदलाव करके Kotlin के कोरटीन का इस्तेमाल करना होगा. इंटरनेट की स्पीड कम होने या इंटरनेट उपलब्ध न होने पर, ऐप्लिकेशन के यूज़र इंटरफ़ेस को भी अपडेट किया जाएगा. इससे उपयोगकर्ता को पता चलेगा कि क्या हो रहा है.

आपको पहले से क्या पता होना चाहिए

  • फ़्रैगमेंट बनाने और इस्तेमाल करने का तरीका.
  • एक फ़्रैगमेंट से दूसरे फ़्रैगमेंट पर जाने का तरीका और फ़्रैगमेंट के बीच डेटा ट्रांसफ़र करने के लिए, safeArgs का इस्तेमाल करने का तरीका.
  • ViewModel, ViewModelProvider.Factory, LiveData, और LiveData ट्रांसफ़ॉर्मेशन जैसे आर्किटेक्चर कॉम्पोनेंट का इस्तेमाल कैसे करें.
  • लंबे समय तक चलने वाले टास्क के लिए कोरूटीन का इस्तेमाल कैसे करें.

आपको क्या सीखने को मिलेगा

  • REST वेब सेवा क्या है.
  • इंटरनेट पर मौजूद REST वेब सर्विस से कनेक्ट करने और जवाब पाने के लिए, Retrofit लाइब्रेरी का इस्तेमाल करना.
  • JSON रिस्पॉन्स को डेटा ऑब्जेक्ट में पार्स करने के लिए, Moshi लाइब्रेरी का इस्तेमाल किया जाता है.

आपको क्या करना होगा

  • वेब सेवा के एपीआई का अनुरोध करने और जवाब को मैनेज करने के लिए, स्टार्टर ऐप्लिकेशन में बदलाव करें.
  • Retrofit लाइब्रेरी का इस्तेमाल करके, अपने ऐप्लिकेशन के लिए नेटवर्क लेयर लागू करें.
  • Moshi लाइब्रेरी की मदद से, वेब सेवा से मिले JSON रिस्पॉन्स को अपने ऐप्लिकेशन के लाइव डेटा में पार्स करें.
  • कोड को आसान बनाने के लिए, Retrofit में कोरूटीन इस्तेमाल करने की सुविधा का इस्तेमाल करें.

इस कोडलैब (और आने वाले कोडलैब) में, आपको MarsRealEstate नाम के स्टार्टर ऐप्लिकेशन के साथ काम करना होगा. यह ऐप्लिकेशन, मंगल ग्रह पर बिक्री के लिए उपलब्ध प्रॉपर्टी दिखाता है. यह ऐप्लिकेशन, प्रॉपर्टी का डेटा पाने और उसे दिखाने के लिए, वेब सेवा से कनेक्ट होता है. इसमें कीमत और प्रॉपर्टी बिक्री या किराये के लिए उपलब्ध है या नहीं जैसी जानकारी शामिल होती है. हर प्रॉपर्टी को दिखाने वाली इमेज, मंगल ग्रह की असली फ़ोटो हैं. इन्हें नासा के मार्स रोवर ने कैप्चर किया है.

इस कोडलैब में बनाया गया ऐप्लिकेशन, विज़ुअल फ़्लैश वाला नहीं होगा. यह ऐप्लिकेशन के नेटवर्किंग लेयर वाले हिस्से पर फ़ोकस करता है, ताकि इंटरनेट से कनेक्ट किया जा सके. साथ ही, वेब सेवा का इस्तेमाल करके प्रॉपर्टी का रॉ डेटा डाउनलोड किया जा सके. यह पक्का करने के लिए कि डेटा को सही तरीके से वापस पाया गया है और पार्स किया गया है, आपको सिर्फ़ टेक्स्ट व्यू में मंगल ग्रह पर मौजूद प्रॉपर्टी की संख्या प्रिंट करनी होगी:

.

MarsRealEstate ऐप्लिकेशन के आर्किटेक्चर में दो मुख्य मॉड्यूल हैं:

  • खास जानकारी वाला फ़्रैगमेंट, जिसमें प्रॉपर्टी की थंबनेल इमेज की ग्रिड होती है. इसे RecyclerView की मदद से बनाया गया है.
  • ज़्यादा जानकारी वाला व्यू फ़्रैगमेंट, जिसमें हर प्रॉपर्टी के बारे में जानकारी होती है.

ऐप्लिकेशन में, हर फ़्रैगमेंट के लिए ViewModel होता है. इस कोडलैब के लिए, आपको नेटवर्क सेवा के लिए एक लेयर बनानी होगी. इसके बाद, ViewModel सीधे तौर पर उस नेटवर्क लेयर से कम्यूनिकेट करेगा. यह उसी तरह से काम करता है जैसा आपने पिछले कोडलैब में किया था, जब ViewModel ने Room डेटाबेस से कम्यूनिकेट किया था.

खास जानकारी देने वाला सेक्शन ViewModel, मंगल ग्रह पर मौजूद प्रॉपर्टी की जानकारी पाने के लिए नेटवर्क कॉल करता है. ज़्यादा जानकारी देने वाले ViewModel में, मंगल ग्रह की उस प्रॉपर्टी की जानकारी होती है जो ज़्यादा जानकारी देने वाले फ़्रैगमेंट में दिखती है. हर ViewModel के लिए, लाइफ़साइकल के बारे में जानकारी रखने वाली डेटा बाइंडिंग के साथ LiveData का इस्तेमाल किया जाता है. इससे डेटा में बदलाव होने पर, ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) को अपडेट किया जा सकता है.

नेविगेशन कॉम्पोनेंट का इस्तेमाल, दोनों फ़्रैगमेंट के बीच नेविगेट करने और चुनी गई प्रॉपर्टी को आर्ग्युमेंट के तौर पर पास करने के लिए किया जाता है.

इस टास्क में, आपको MarsRealEstate के लिए स्टार्टर ऐप्लिकेशन डाउनलोड और चलाना है. साथ ही, प्रोजेक्ट के स्ट्रक्चर के बारे में जानकारी हासिल करनी है.

पहला चरण: फ़्रैगमेंट और नेविगेशन के बारे में जानना

  1. MarsRealEstate starter app डाउनलोड करें और इसे Android Studio में खोलें.
  2. app/java/MainActivity.kt देखें. ऐप्लिकेशन, दोनों स्क्रीन के लिए फ़्रैगमेंट का इस्तेमाल करता है. इसलिए, ऐक्टिविटी का काम सिर्फ़ ऐक्टिविटी के लेआउट को लोड करना है.
  3. app/res/layout/activity_main.xml देखें. ऐक्टिविटी लेआउट, दो फ़्रैगमेंट के लिए होस्ट होता है. इन्हें नेविगेशन फ़ाइल में तय किया जाता है. इस लेआउट में, NavHostFragment और उससे जुड़े नेविगेशन कंट्रोलर को nav_graph रिसॉर्स के साथ इंस्टैंटिएट किया जाता है.
  4. app/res/navigation/nav_graph.xml खोलें. यहां आपको दो फ़्रैगमेंट के बीच नेविगेशन का संबंध दिखेगा. नेविगेशन ग्राफ़ StartDestination, overviewFragment की ओर इशारा करता है. इसलिए, ऐप्लिकेशन लॉन्च होने पर खास जानकारी देने वाला फ़्रैगमेंट इंस्टैंटिएट हो जाता है.

दूसरा चरण: Kotlin सोर्स फ़ाइलों और डेटा बाइंडिंग के बारे में जानना

  1. प्रोजेक्ट पैन में, app > java को बड़ा करें. ध्यान दें कि MarsRealEstate ऐप्लिकेशन में तीन पैकेज फ़ोल्डर हैं: detail, network, और overview. ये आपके ऐप्लिकेशन के तीन मुख्य कॉम्पोनेंट से जुड़े होते हैं: खास जानकारी और ज़्यादा जानकारी वाले फ़्रैगमेंट, और नेटवर्क लेयर के लिए कोड.
  2. app/java/overview/OverviewFragment.kt खोलें. OverviewFragment, OverviewViewModel को लेज़ी तरीके से शुरू करता है. इसका मतलब है कि OverviewViewModel को पहली बार इस्तेमाल किए जाने पर बनाया जाता है.
  3. onCreateView() तरीके की जांच करें. यह तरीका, डेटा बाइंडिंग का इस्तेमाल करके fragment_overview लेआउट को बड़ा करता है. साथ ही, बाइंडिंग लाइफ़साइकल के मालिक को खुद (this) पर सेट करता है. इसके अलावा, binding ऑब्जेक्ट में viewModel वैरिएबल को इस पर सेट करता है. हमने लाइफ़साइकल के मालिक को सेट कर दिया है. इसलिए, डेटा बाइंडिंग में इस्तेमाल किया गया कोई भी LiveData, बदलावों के लिए अपने-आप मॉनिटर किया जाएगा. साथ ही, यूज़र इंटरफ़ेस (यूआई) को उसके हिसाब से अपडेट किया जाएगा.
  4. app/java/overview/OverviewViewModel खोलें. जवाब एक LiveData है और हमने बाइंडिंग वैरिएबल के लिए लाइफ़साइकल सेट किया है. इसलिए, इसमें होने वाले किसी भी बदलाव से ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) अपडेट हो जाएगा.
  5. init ब्लॉक की जांच करें. ViewModel बनाए जाने पर, यह getMarsRealEstateProperties() तरीके को कॉल करता है.
  6. getMarsRealEstateProperties() तरीके की जांच करें. इस स्टार्टर ऐप्लिकेशन में, इस तरीके में प्लेसहोल्डर रिस्पॉन्स शामिल होता है. इस कोडलैब का मकसद, इंटरनेट से मिले असली डेटा का इस्तेमाल करके, LiveData में मौजूद जवाब ViewModel को अपडेट करना है.
  7. app/res/layout/fragment_overview.xml खोलें. यह इस कोडलैब में इस्तेमाल किए जाने वाले खास जानकारी वाले फ़्रैगमेंट का लेआउट है. इसमें व्यू मॉडल के लिए डेटा बाइंडिंग शामिल है. यह OverviewViewModel को इंपोर्ट करता है. इसके बाद, ViewModel से मिले जवाब को TextView से बाइंड करता है. बाद के कोडलैब में, टेक्स्ट व्यू को RecyclerView में मौजूद इमेज के ग्रिड से बदल दिया जाता है.
  8. ऐप्लिकेशन को कंपाइल करें और चलाएं. आपको इस ऐप्लिकेशन के मौजूदा वर्शन में सिर्फ़ स्टार्टर रिस्पॉन्स दिखेगा—"Set the Mars API Response here!"

मंगल ग्रह पर मौजूद रीयल एस्टेट का डेटा, वेब सर्वर पर REST वेब सेवा के तौर पर सेव किया जाता है. REST आर्किटेक्चर का इस्तेमाल करने वाली वेब सेवाओं को स्टैंडर्ड वेब कॉम्पोनेंट और प्रोटोकॉल का इस्तेमाल करके बनाया जाता है.

यूआरआई के ज़रिए, वेब सर्विस से स्टैंडर्ड तरीके से अनुरोध किया जाता है. वेब यूआरएल, यूआरआई का ही एक टाइप है. इस पूरे कोर्स में, दोनों को एक-दूसरे की जगह पर इस्तेमाल किया गया है. उदाहरण के लिए, इस सबक के ऐप्लिकेशन में, आपको इस सर्वर से सारा डेटा मिलता है:

https://android-kotlin-fun-mars-server.appspot.com

अगर अपने ब्राउज़र में यह यूआरएल डाला जाता है, तो आपको मंगल ग्रह पर मौजूद सभी उपलब्ध प्रॉपर्टी की सूची दिखेगी!

https://android-kotlin-fun-mars-server.appspot.com/realestate

वेब सेवा से मिलने वाला रिस्पॉन्स आम तौर पर JSON फ़ॉर्मैट में होता है. यह स्ट्रक्चर्ड डेटा को दिखाने के लिए इंटरचेंज फ़ॉर्मैट है. अगले टास्क में, JSON के बारे में ज़्यादा जानें. हालांकि, इसकी छोटी सी जानकारी यह है कि JSON ऑब्जेक्ट, कुंजी-वैल्यू पेयर का कलेक्शन होता है. इसे कभी-कभी डिक्शनरी, हैश मैप या एसोसिएटिव ऐरे भी कहा जाता है. JSON ऑब्जेक्ट के कलेक्शन को JSON ऐरे कहा जाता है. वेब सेवा से मिलने वाला रिस्पॉन्स भी एक ऐरे होता है.

इस डेटा को ऐप्लिकेशन में पाने के लिए, आपके ऐप्लिकेशन को नेटवर्क कनेक्शन बनाना होगा और उस सर्वर से कम्यूनिकेट करना होगा. इसके बाद, जवाब के तौर पर मिले डेटा को ऐसे फ़ॉर्मैट में बदलना होगा जिसका इस्तेमाल ऐप्लिकेशन कर सके. इस कोडलैब में, इस कनेक्शन को बनाने के लिए Retrofit नाम की REST क्लाइंट लाइब्रेरी का इस्तेमाल किया जाता है.

पहला चरण: Gradle में Retrofit डिपेंडेंसी जोड़ना

  1. build.gradle (Module: app) खोलें.
  2. dependencies सेक्शन में, Retrofit लाइब्रेरी के लिए ये लाइनें जोड़ें:
implementation "com.squareup.retrofit2:retrofit:$version_retrofit"
implementation "com.squareup.retrofit2:converter-scalars:$version_retrofit"


ध्यान दें कि वर्शन नंबर, प्रोजेक्ट की Gradle फ़ाइल में अलग से तय किए जाते हैं. पहली डिपेंडेंसी, Retrofit 2 लाइब्रेरी के लिए है. वहीं, दूसरी डिपेंडेंसी, Retrofit स्केलर कन्वर्टर के लिए है. यह कनवर्टर, Retrofit को JSON नतीजे को String के तौर पर दिखाने की सुविधा देता है. दोनों लाइब्रेरी एक साथ काम करती हैं.

  1. नई डिपेंडेंसी के साथ प्रोजेक्ट को फिर से बनाने के लिए, अभी सिंक करें पर क्लिक करें.

दूसरा चरण: MarsApiService लागू करना

Retrofit, वेब सर्विस के कॉन्टेंट के आधार पर ऐप्लिकेशन के लिए नेटवर्क एपीआई बनाता है. यह वेब सेवा से डेटा फ़ेच करता है और उसे एक अलग कन्वर्टर लाइब्रेरी के ज़रिए रूट करता है. इस लाइब्रेरी को पता होता है कि डेटा को कैसे डिकोड करना है और उसे काम के ऑब्जेक्ट के तौर पर कैसे दिखाना है. Retrofit में, वेब डेटा के लोकप्रिय फ़ॉर्मैट के लिए पहले से ही सहायता उपलब्ध है. जैसे, XML और JSON. Retrofit, आपके लिए ज़्यादातर नेटवर्क लेयर बनाता है. इसमें बैकग्राउंड थ्रेड पर अनुरोध चलाने जैसी ज़रूरी जानकारी शामिल होती है.

MarsApiService क्लास, ऐप्लिकेशन के लिए नेटवर्क लेयर को होल्ड करती है. इसका मतलब है कि यह वह एपीआई है जिसका इस्तेमाल आपका ViewModel, वेब सेवा से कम्यूनिकेट करने के लिए करेगा. यह वह क्लास है जहां आपको Retrofit सर्विस एपीआई लागू करना होगा.

  1. app/java/network/MarsApiService.kt खोलें. फ़िलहाल, इस फ़ाइल में सिर्फ़ एक चीज़ है: वेब सेवा के बेस यूआरएल के लिए एक कॉन्स्टेंट.
private const val BASE_URL = 
   "https://android-kotlin-fun-mars-server.appspot.com"
  1. उस कॉन्स्टेंट के ठीक नीचे, Retrofit ऑब्जेक्ट बनाने के लिए Retrofit बिल्डर का इस्तेमाल करें. अनुरोध किए जाने पर, retrofit2.Retrofit और retrofit2.converter.scalars.ScalarsConverterFactory इंपोर्ट करें.
private val retrofit = Retrofit.Builder()
   .addConverterFactory(ScalarsConverterFactory.create())
   .baseUrl(BASE_URL)
   .build()

वेब सर्विस एपीआई बनाने के लिए, Retrofit को कम से कम दो चीज़ों की ज़रूरत होती है: वेब सर्विस के लिए बुनियादी यूआरआई और कन्वर्टर फ़ैक्ट्री. कनवर्टर, Retrofit को बताता है कि वेब सेवा से मिले डेटा का क्या करना है. इस मामले में, आपको Retrofit से वेब सर्विस से JSON रिस्पॉन्स फ़ेच करने और उसे String के तौर पर वापस भेजने के लिए कहना है. Retrofit में एक ScalarsConverter होता है, जो स्ट्रिंग और अन्य प्रिमिटिव टाइप के साथ काम करता है. इसलिए, ScalarsConverterFactory के इंस्टेंस के साथ बिल्डर पर addConverterFactory() को कॉल किया जाता है. आखिर में, Retrofit ऑब्जेक्ट बनाने के लिए build() को कॉल किया जाता है.

  1. Retrofit बिल्डर को कॉल करने के ठीक नीचे, एक ऐसा इंटरफ़ेस तय करें जो यह तय करता है कि Retrofit, एचटीटीपी अनुरोधों का इस्तेमाल करके वेब सर्वर से कैसे कम्यूनिकेट करता है. अनुरोध किए जाने पर, retrofit2.http.GET और retrofit2.Call इंपोर्ट करें.
interface MarsApiService {
    @GET("realestate")
    fun getProperties():
            Call<String>
}

फ़िलहाल, हमारा मकसद वेब सर्विस से JSON रिस्पॉन्स स्ट्रिंग पाना है. इसके लिए, आपको सिर्फ़ एक तरीके की ज़रूरत है: getProperties(). Retrofit को यह बताने के लिए कि इस तरीके से क्या किया जाना चाहिए, @GET एनोटेशन का इस्तेमाल करें. साथ ही, उस वेब सेवा के तरीके के लिए पाथ या एंडपॉइंट तय करें. इस मामले में, एंडपॉइंट को realestate कहा जाता है. getProperties() तरीके को लागू करने पर, Retrofit, एंडपॉइंट realestate को बेस यूआरएल (जिसे आपने Retrofit बिल्डर में तय किया है) में जोड़ता है और एक Call ऑब्जेक्ट बनाता है. अनुरोध शुरू करने के लिए, उस Call ऑब्जेक्ट का इस्तेमाल किया जाता है.

  1. Retrofit सर्विस को शुरू करने के लिए, MarsApiService इंटरफ़ेस के नीचे, MarsApi नाम का एक सार्वजनिक ऑब्जेक्ट तय करें.
object MarsApi {
    val retrofitService : MarsApiService by lazy { 
       retrofit.create(MarsApiService::class.java) }
}

Retrofit create() तरीके से, MarsApiService इंटरफ़ेस के साथ Retrofit सेवा बनाई जाती है. यह कॉल महंगा है और ऐप्लिकेशन को सिर्फ़ एक Retrofit सेवा इंस्टेंस की ज़रूरत होती है. इसलिए, MarsApi नाम के सार्वजनिक ऑब्जेक्ट का इस्तेमाल करके, सेवा को ऐप्लिकेशन के बाकी हिस्सों के लिए उपलब्ध कराया जाता है. साथ ही, Retrofit सेवा को वहां लेज़ी तरीके से शुरू किया जाता है. अब सेटअप पूरा हो गया है. इसलिए, जब भी आपका ऐप्लिकेशन MarsApi.retrofitService को कॉल करेगा, उसे एक सिंगलटन Retrofit ऑब्जेक्ट मिलेगा, जो MarsApiService को लागू करता है.

तीसरा चरण: OverviewViewModel में वेब सेवा को कॉल करें

  1. app/java/overview/OverviewViewModel.kt खोलें. नीचे की ओर स्क्रोल करके, getMarsRealEstateProperties() तरीके पर जाएं.
private fun getMarsRealEstateProperties() {
   _response.value = "Set the Mars API Response here!"
}

यह वह तरीका है जिसमें Retrofit सेवा को कॉल किया जाएगा और वापस मिली JSON स्ट्रिंग को हैंडल किया जाएगा. फ़िलहाल, जवाब के लिए सिर्फ़ एक प्लेसहोल्डर स्ट्रिंग है.

  1. उस प्लेसहोल्डर लाइन को मिटाएं जो जवाब को "Set the Mars API Response here!" पर सेट करती है
  2. getMarsRealEstateProperties() में, यहां दिखाया गया कोड जोड़ें. अनुरोध किए जाने पर, retrofit2.Callback और com.example.android.marsrealestate.network.MarsApi इंपोर्ट करें.

    MarsApi.retrofitService.getProperties() वाला तरीका, Call ऑब्जेक्ट दिखाता है. इसके बाद, उस ऑब्जेक्ट पर enqueue() को कॉल करके, बैकग्राउंड थ्रेड पर नेटवर्क अनुरोध शुरू किया जा सकता है.
MarsApi.retrofitService.getProperties().enqueue( 
   object: Callback<String> {
})
  1. लाल रंग से अंडरलाइन किए गए शब्द object पर क्लिक करें. कोड > लागू करने के तरीके चुनें. सूची से onResponse() और onFailure(), दोनों को चुनें.


    Android Studio, हर तरीके में TODO के साथ कोड जोड़ता है:
override fun onFailure(call: Call<String>, t: Throwable) {
       TODO("not implemented") 
}

override fun onResponse(call: Call<String>, 
   response: Response<String>) {
       TODO("not implemented") 
}
  1. onFailure() में, TODO को मिटाएं और _response को गड़बड़ी के मैसेज पर सेट करें. ऐसा यहां दिखाए गए तरीके से करें. _response एक LiveData स्ट्रिंग है. इससे यह तय होता है कि टेक्स्ट व्यू में क्या दिखाया जाएगा. हर राज्य को _response LiveData.

    अपडेट करना होगा. वेब सेवा का जवाब न मिलने पर, onFailure() कॉलबैक को कॉल किया जाता है. इस जवाब के लिए, _response status को "Failure: " पर सेट करें. साथ ही, इसे Throwable आर्ग्युमेंट से मिले मैसेज के साथ जोड़ें.
override fun onFailure(call: Call<String>, t: Throwable) {
   _response.value = "Failure: " + t.message
}
  1. onResponse() में, TODO को मिटाएं और _response को जवाब के मुख्य हिस्से पर सेट करें. अनुरोध पूरा होने और वेब सेवा से जवाब मिलने पर, onResponse() कॉलबैक को कॉल किया जाता है.
override fun onResponse(call: Call<String>, 
   response: Response<String>) {
      _response.value = response.body()
}

चौथा चरण: इंटरनेट की अनुमति तय करना

  1. MarsRealEstate ऐप्लिकेशन को कंपाइल करें और चलाएं. ध्यान दें कि ऐप्लिकेशन तुरंत बंद हो जाता है और गड़बड़ी का मैसेज दिखता है.
  2. Android Studio में Logcat टैब पर क्लिक करें और लॉग में मौजूद गड़बड़ी को नोट करें. यह गड़बड़ी इस तरह की लाइन से शुरू होती है:
Process: com.example.android.marsrealestate, PID: 10646
java.lang.SecurityException: Permission denied (missing INTERNET permission?)

गड़बड़ी के मैसेज से पता चलता है कि आपके ऐप्लिकेशन में INTERNET की अनुमति मौजूद नहीं है. इंटरनेट से कनेक्ट करने पर सुरक्षा से जुड़ी समस्याएं हो सकती हैं. इसलिए, ऐप्लिकेशन डिफ़ॉल्ट रूप से इंटरनेट से कनेक्ट नहीं होते हैं. आपको Android को साफ़ तौर पर बताना होगा कि ऐप्लिकेशन को इंटरनेट का ऐक्सेस चाहिए.

  1. app/manifests/AndroidManifest.xml खोलें. इस लाइन को <application> टैग से ठीक पहले जोड़ें:
<uses-permission android:name="android.permission.INTERNET" />
  1. ऐप्लिकेशन को फिर से कंपाइल और रन करें. अगर आपका इंटरनेट कनेक्शन ठीक से काम कर रहा है, तो आपको JSON टेक्स्ट दिखेगा. इसमें Mars Property का डेटा होगा.
  2. ऐप्लिकेशन बंद करने के लिए, अपने डिवाइस या एम्युलेटर में मौजूद वापस जाएं बटन पर टैप करें.
  3. अपने डिवाइस या एम्युलेटर को एयरप्लेन मोड में डालें. इसके बाद, हाल ही के ऐप्लिकेशन वाले मेन्यू से ऐप्लिकेशन को फिर से खोलें या Android Studio से ऐप्लिकेशन को फिर से शुरू करें.


  1. हवाई जहाज़ मोड को फिर से बंद करें.

अब आपको Mars वेब सर्विस से JSON रिस्पॉन्स मिल रहा है. यह एक अच्छी शुरुआत है. हालांकि, आपको JSON स्ट्रिंग की नहीं, बल्कि Kotlin ऑब्जेक्ट की ज़रूरत होती है. Moshi नाम की एक लाइब्रेरी है. यह Android JSON पार्सर है, जो JSON स्ट्रिंग को Kotlin ऑब्जेक्ट में बदलता है. Retrofit में एक ऐसा कन्वर्टर होता है जो Moshi के साथ काम करता है. इसलिए, यह आपके लिए एक बेहतरीन लाइब्रेरी है.

इस टास्क में, Moshi लाइब्रेरी का इस्तेमाल Retrofit के साथ किया जाता है. इससे वेब सर्विस से मिले JSON रिस्पॉन्स को, काम के Mars Property Kotlin ऑब्जेक्ट में पार्स किया जा सकता है. आपने ऐप्लिकेशन में बदलाव किया है, ताकि रॉ JSON दिखाने के बजाय, ऐप्लिकेशन में मंगल ग्रह की प्रॉपर्टी की संख्या दिखे.

पहला चरण: Moshi लाइब्रेरी की डिपेंडेंसी जोड़ना

  1. build.gradle (Module: app) खोलें.
  2. Moshi डिपेंडेंसी शामिल करने के लिए, डिपेंडेंसी सेक्शन में नीचे दिखाया गया कोड जोड़ें. Retrofit की तरह ही, $version_moshi को प्रोजेक्ट-लेवल की Gradle फ़ाइल में अलग से तय किया जाता है. इन डिपेंडेंसी से, Moshi की मुख्य JSON लाइब्रेरी और Moshi के Kotlin सपोर्ट के लिए सहायता मिलती है.
implementation "com.squareup.moshi:moshi:$version_moshi"
implementation "com.squareup.moshi:moshi-kotlin:$version_moshi"
  1. dependencies ब्लॉक में, Retrofit स्केलर कन्वर्टर के लिए लाइन ढूंढें:
implementation "com.squareup.retrofit2:converter-scalars:$version_retrofit"
  1. converter-moshi का इस्तेमाल करने के लिए, उस लाइन को बदलें:
implementation "com.squareup.retrofit2:converter-moshi:$version_retrofit"
  1. नई डिपेंडेंसी के साथ प्रोजेक्ट को फिर से बनाने के लिए, अभी सिंक करें पर क्लिक करें.

दूसरा चरण: MarsProperty डेटा क्लास लागू करना

वेब सर्विस से मिले JSON रिस्पॉन्स की सैंपल एंट्री कुछ इस तरह दिखती है:

[{"price":450000,
"id":"424906",
"type":"rent",
"img_src":"http://mars.jpl.nasa.gov/msl-raw-images/msss/01000/mcam/1000ML0044631300305227E03_DXXX.jpg"},
...]

ऊपर दिखाया गया JSON रिस्पॉन्स एक ऐरे है. इसे स्क्वेयर ब्रैकेट से दिखाया गया है. ऐरे में JSON ऑब्जेक्ट होते हैं, जो कर्ली ब्रेसिज़ से घिरे होते हैं. हर ऑब्जेक्ट में, कोलन से अलग किए गए नाम-वैल्यू पेयर का सेट होता है. नामों को कोटेशन मार्क में रखा जाता है. वैल्यू, संख्याएं या स्ट्रिंग हो सकती हैं. स्ट्रिंग को भी कोटेशन मार्क में रखा जाता है. उदाहरण के लिए, इस प्रॉपर्टी के लिए price की वैल्यू 4,50,000 डॉलर है. साथ ही, img_src एक यूआरएल है, जो सर्वर पर इमेज फ़ाइल की जगह है.

ऊपर दिए गए उदाहरण में, ध्यान दें कि Mars की हर प्रॉपर्टी एंट्री में, JSON कुंजी और वैल्यू के ये जोड़े मौजूद हैं:

  • price: मंगल ग्रह की प्रॉपर्टी की कीमत, संख्या के तौर पर.
  • id: प्रॉपर्टी का आईडी, स्ट्रिंग के तौर पर.
  • type: "rent" या "buy" में से कोई एक.
  • img_src: इमेज का यूआरएल, स्ट्रिंग के तौर पर.

Moshi इस JSON डेटा को पार्स करता है और इसे Kotlin ऑब्जेक्ट में बदलता है. इसके लिए, पार्स किए गए नतीजों को सेव करने के लिए, Kotlin डेटा क्लास की ज़रूरत होती है. इसलिए, अगला चरण उस क्लास को बनाना है.

  1. app/java/network/MarsProperty.kt खोलें.
  2. मौजूदा MarsProperty क्लास की परिभाषा को इस कोड से बदलें:
data class MarsProperty(
   val id: String, val img_src: String,
   val type: String,
   val price: Double
)

ध्यान दें कि MarsProperty क्लास में मौजूद हर वैरिएबल, JSON ऑब्जेक्ट में मौजूद किसी कुंजी के नाम से मेल खाता है. JSON में मौजूद टाइप से मेल खाने के लिए, price को छोड़कर बाकी सभी वैल्यू के लिए String ऑब्जेक्ट का इस्तेमाल करें. price एक Double है. Double का इस्तेमाल, किसी भी JSON नंबर को दिखाने के लिए किया जा सकता है.

जब Moshi JSON को पार्स करता है, तो वह नाम के हिसाब से कुंजियों का मिलान करता है और डेटा ऑब्जेक्ट में सही वैल्यू भरता है.

  1. img_src बटन के लिए दी गई लाइन की जगह, यहां दी गई लाइन डालें. अनुरोध किए जाने पर, com.squareup.moshi.Json इंपोर्ट करें.
@Json(name = "img_src") val imgSrcUrl: String,

कभी-कभी JSON रिस्पॉन्स में मौजूद कुंजी के नाम, Kotlin प्रॉपर्टी को भ्रमित करने वाले बना सकते हैं या आपकी कोडिंग स्टाइल से मेल नहीं खा सकते. उदाहरण के लिए, JSON फ़ाइल में img_src कुंजी, अंडरस्कोर का इस्तेमाल करती है, जबकि Kotlin प्रॉपर्टी आम तौर पर बड़े और छोटे अक्षरों ("कैमल केस") का इस्तेमाल करती हैं.

अगर आपको अपनी डेटा क्लास में ऐसे वैरिएबल के नाम इस्तेमाल करने हैं जो JSON रिस्पॉन्स में मौजूद कुंजी के नामों से अलग हैं, तो @Json एनोटेशन का इस्तेमाल करें. इस उदाहरण में, डेटा क्लास में मौजूद वैरिएबल का नाम imgSrcUrl है. इस वैरिएबल को @Json(name = "img_src") का इस्तेमाल करके, JSON एट्रिब्यूट img_src पर मैप किया जाता है.

तीसरा चरण: MarsApiService और OverviewViewModel को अपडेट करना

MarsProperty डेटा क्लास का इस्तेमाल करके, अब नेटवर्क एपीआई और ViewModel को अपडेट किया जा सकता है, ताकि Moshi डेटा को शामिल किया जा सके.

  1. network/MarsApiService.kt खोलें. आपको ScalarsConverterFactory के लिए, क्लास मौजूद न होने से जुड़ी गड़बड़ियां दिख सकती हैं. ऐसा इसलिए हुआ है, क्योंकि आपने पहले चरण में Retrofit की डिपेंडेंसी में बदलाव किया था. इन गड़बड़ियों को जल्द से जल्द ठीक करें.
  2. Moshi इंस्टेंस बनाने के लिए, फ़ाइल में सबसे ऊपर, Retrofit बिल्डर से ठीक पहले यह कोड जोड़ें. अनुरोध किए जाने पर, com.squareup.moshi.Moshi और com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory इंपोर्ट करें.
private val moshi = Moshi.Builder()
   .add(KotlinJsonAdapterFactory())
   .build()

आपने Retrofit के साथ जो किया था उसी तरह, यहां Moshi बिल्डर का इस्तेमाल करके moshi ऑब्जेक्ट बनाया जाता है. Moshi के एनोटेशन, Kotlin के साथ ठीक से काम करें, इसके लिए KotlinJsonAdapterFactory जोड़ें. इसके बाद, build() को कॉल करें.

  1. ScalarConverterFactory के बजाय MoshiConverterFactory का इस्तेमाल करने के लिए, Retrofit बिल्डर को बदलें. साथ ही, अभी-अभी बनाया गया moshi इंस्टेंस पास करें. अनुरोध किए जाने पर, retrofit2.converter.moshi.MoshiConverterFactory इंपोर्ट करें.
private val retrofit = Retrofit.Builder()
   .addConverterFactory(MoshiConverterFactory.create(moshi))
   .baseUrl(BASE_URL)
   .build()
  1. ScalarConverterFactory के लिए भी इंपोर्ट किया गया डेटा मिटाएं.

मिटाने के लिए कोड:

import retrofit2.converter.scalars.ScalarsConverterFactory
  1. MarsApiService इंटरफ़ेस को अपडेट करें, ताकि Retrofit, Call<String> के बजाय MarsProperty ऑब्जेक्ट की सूची दिखाए.
interface MarsApiService {
   @GET("realestate")
   fun getProperties():
      Call<List<MarsProperty>>
}
  1. OverviewViewModel.kt खोलें. नीचे की ओर स्क्रोल करके, getMarsRealEstateProperties() तरीके में getProperties().enqueue() को कॉल करने वाले फ़ंक्शन पर जाएं.
  2. आर्गुमेंट को Callback<String> से बदलकर enqueue() से Callback<List<MarsProperty>> करें. अनुरोध किए जाने पर, com.example.android.marsrealestate.network.MarsProperty इंपोर्ट करें.
MarsApi.retrofitService.getProperties().enqueue( 
   object: Callback<List<MarsProperty>> {
  1. onFailure() में, आर्ग्युमेंट को Call<String> से बदलकर Call<List<MarsProperty>> करें:
override fun onFailure(call: Call<List<MarsProperty>>, t: Throwable) {
  1. onResponse() के दोनों तर्कों में एक जैसा बदलाव करें:
override fun onResponse(call: Call<List<MarsProperty>>, 
   response: Response<List<MarsProperty>>) {
  1. onResponse() के मुख्य हिस्से में, _response.value को असाइन किए गए मौजूदा असाइनमेंट की जगह, यहां दिखाया गया असाइनमेंट डालें. response.body() अब MarsProperty ऑब्जेक्ट की सूची है. इसलिए, इस सूची का साइज़, पार्स की गई प्रॉपर्टी की संख्या है. इस रिस्पॉन्स मैसेज में, प्रॉपर्टी की संख्या प्रिंट की जाती है:
_response.value = 
   "Success: ${response.body()?.size} Mars properties retrieved"
  1. पक्का करें कि हवाई जहाज़ मोड बंद हो. ऐप्लिकेशन को कंपाइल करें और चलाएं. इस बार मैसेज में, वेब सेवा से मिली प्रॉपर्टी की संख्या दिखनी चाहिए:

अब Retrofit API सर्विस चल रही है. हालांकि, यह दो कॉलबैक तरीकों के साथ कॉलबैक का इस्तेमाल करती है, जिन्हें आपको लागू करना था. एक तरीका, अनुरोध पूरा होने पर काम करता है और दूसरा, अनुरोध पूरा न होने पर काम करता है. अनुरोध पूरा न होने पर, गड़बड़ियों की जानकारी मिलती है. अगर कॉलबैक के बजाय, एक्सेप्शन हैंडलिंग के साथ कोरूटीन का इस्तेमाल किया जाए, तो आपका कोड ज़्यादा असरदार और पढ़ने में आसान होगा. Retrofit में, कोरूटीन को इंटिग्रेट करने वाली लाइब्रेरी होती है.

इस टास्क में, आपको अपनी नेटवर्क सेवा और ViewModel को को-रूटीन का इस्तेमाल करने के लिए बदलना है.

पहला चरण: को-रूटीन की डिपेंडेंसी जोड़ना

  1. build.gradle (Module: app) खोलें.
  2. डिपेंडेंसी सेक्शन में, कोर Kotlin कोराटीन लाइब्रेरी और Retrofit कोराटीन लाइब्रेरी के लिए सहायता जोड़ें:
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version_kotlin_coroutines"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$version_kotlin_coroutines"

implementation "com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:$version_retrofit_coroutines_adapter"
  1. नई डिपेंडेंसी के साथ प्रोजेक्ट को फिर से बनाने के लिए, अभी सिंक करें पर क्लिक करें.

दूसरा चरण: MarsApiService और OverviewViewModel को अपडेट करना

  1. MarsApiService.kt में, CoroutineCallAdapterFactory का इस्तेमाल करने के लिए Retrofit बिल्डर को अपडेट करें. अब पूरा बिल्डर ऐसा दिखता है:
private val retrofit = Retrofit.Builder()
        .addConverterFactory(MoshiConverterFactory.create(moshi))
        .addCallAdapterFactory(CoroutineCallAdapterFactory())
        .baseUrl(BASE_URL)
        .build()

कॉल अडैप्टर, Retrofit को ऐसे एपीआई बनाने की सुविधा देते हैं जो डिफ़ॉल्ट Call क्लास के अलावा कुछ और दिखाते हैं. इस मामले में, CoroutineCallAdapterFactory की मदद से, getProperties() से मिले Call ऑब्जेक्ट को Deferred ऑब्जेक्ट से बदला जा सकता है.

  1. getProperties() तरीके में, Call<List<MarsProperty>> को Deferred<List<MarsProperty>> में बदलें. अनुरोध किए जाने पर, kotlinx.coroutines.Deferred इंपोर्ट करें. पूरा getProperties() तरीका ऐसा दिखता है:
@GET("realestate")
fun getProperties():
   Deferred<List<MarsProperty>>

Deferred इंटरफ़ेस, एक कोरूटीन जॉब तय करता है. यह जॉब, नतीजे की वैल्यू (Deferred, Job से इनहेरिट करता है) दिखाता है. Deferred इंटरफ़ेस में await() नाम का एक तरीका शामिल होता है. इससे आपका कोड, वैल्यू तैयार होने तक इंतज़ार करता है. हालांकि, इस दौरान कोड ब्लॉक नहीं होता. इसके बाद, वह वैल्यू रिटर्न की जाती है.

  1. OverviewViewModel.kt खोलें. init ब्लॉक से ठीक पहले, एक को-रूटीन जॉब जोड़ें:
private var viewModelJob = Job()
  1. मुख्य डिस्पैचर का इस्तेमाल करके, उस नए काम के लिए एक कोरूटीन स्कोप बनाएं:
private val coroutineScope = CoroutineScope(
   viewModelJob + Dispatchers.Main )

Dispatchers.Main डिस्पैचर, अपने काम के लिए यूज़र इंटरफ़ेस (यूआई) थ्रेड का इस्तेमाल करता है. Retrofit अपना सारा काम बैकग्राउंड थ्रेड पर करता है. इसलिए, स्कोप के लिए किसी अन्य थ्रेड का इस्तेमाल करने की कोई वजह नहीं है. इससे आपको नतीजे मिलने पर, MutableLiveData की वैल्यू को आसानी से अपडेट करने की सुविधा मिलती है.

  1. getMarsRealEstateProperties() के अंदर मौजूद सभी कोड मिटाएं. यहां enqueue() कॉल और onFailure() और onResponse() कॉलबैक के बजाय, को-रूटीन का इस्तेमाल किया जाएगा.
  2. getMarsRealEstateProperties() के अंदर, कोरूटीन लॉन्च करें:
coroutineScope.launch { 

}


नेटवर्क टास्क के लिए Retrofit से मिले Deferred ऑब्जेक्ट का इस्तेमाल करने के लिए, आपको कोरूटीन के अंदर होना होगा. इसलिए, यहां आपने अभी-अभी बनाई गई कोरूटीन लॉन्च की है. अब भी मुख्य थ्रेड पर कोड लागू किया जा रहा है, लेकिन अब कॉंकरेंसी को मैनेज करने का काम कोरूटीन को सौंपा जा रहा है.

  1. लॉन्च ब्लॉक में, retrofitService ऑब्जेक्ट पर getProperties() को कॉल करें:
var getPropertiesDeferred = MarsApi.retrofitService.getProperties()

MarsApi सेवा से getProperties() को कॉल करने पर, बैकग्राउंड थ्रेड पर नेटवर्क कॉल बनाया और शुरू किया जाता है. साथ ही, उस टास्क के लिए Deferred ऑब्जेक्ट दिखाया जाता है.

  1. लॉन्च ब्लॉक में, अपवादों को मैनेज करने के लिए try/catch ब्लॉक जोड़ें:
try {

} catch (e: Exception) {
  
}
  1. try {} ब्लॉक में, Deferred ऑब्जेक्ट पर await() को कॉल करें:
var listResult = getPropertiesDeferred.await()

Deferred ऑब्जेक्ट पर await() को कॉल करने पर, वैल्यू तैयार होने पर नेटवर्क कॉल से नतीजा मिलता है. await() तरीका नॉन-ब्लॉकिंग है. इसलिए, Mars API सेवा मौजूदा थ्रेड को ब्लॉक किए बिना नेटवर्क से डेटा वापस लाती है. यह इसलिए ज़रूरी है, क्योंकि हम यूज़र इंटरफ़ेस (यूआई) थ्रेड के स्कोप में हैं. टास्क पूरा होने के बाद, आपका कोड वहीं से काम करना शुरू कर देता है जहां से वह रुका था. यह try {} के अंदर होता है, ताकि अपवादों का पता लगाया जा सके.

  1. साथ ही, try {} ब्लॉक में, await() तरीके के बाद, अनुरोध पूरा होने पर मिलने वाले जवाब के मैसेज को अपडेट करें:
_response.value = 
   "Success: ${listResult.size} Mars properties retrieved"
  1. catch {} ब्लॉक में, गड़बड़ी के जवाब को मैनेज करें:
_response.value = "Failure: ${e.message}"


getMarsRealEstateProperties() तरीके का पूरा फ़ॉर्मूला अब ऐसा दिखता है:

private fun getMarsRealEstateProperties() {
   coroutineScope.launch {
       var getPropertiesDeferred = 
          MarsApi.retrofitService.getProperties()
       try {          
           _response.value = 
              "Success: ${listResult.size} Mars properties retrieved"
       } catch (e: Exception) {
           _response.value = "Failure: ${e.message}"
       }
   }
}
  1. क्लास के सबसे नीचे, इस कोड के साथ onCleared() कॉलबैक जोड़ें:
override fun onCleared() {
   super.onCleared()
   viewModelJob.cancel()
}

ViewModel के बंद होने पर, डेटा लोड होना बंद हो जाना चाहिए. ऐसा इसलिए, क्योंकि इस ViewModel का इस्तेमाल करने वाला OverviewFragment बंद हो जाएगा. ViewModel के बंद होने पर, डेटा लोड होने की प्रोसेस को रोकने के लिए, onCleared() को बदलकर नौकरी रद्द की जाती है.

  1. ऐप्लिकेशन को कंपाइल और चलाएं. आपको इस बार भी वही नतीजा मिलेगा जो पिछले टास्क में मिला था (प्रॉपर्टी की संख्या की रिपोर्ट). हालांकि, इसमें ज़्यादा आसान कोड और गड़बड़ी ठीक करने की सुविधा होगी.

Android Studio प्रोजेक्ट: MarsRealEstateNetwork

REST वेब सेवाएं

  • वेब सर्विस, इंटरनेट पर उपलब्ध एक ऐसी सेवा होती है जिसकी मदद से आपका ऐप्लिकेशन अनुरोध कर सकता है और डेटा वापस पा सकता है.
  • सामान्य वेब सेवाएं, REST आर्किटेक्चर का इस्तेमाल करती हैं. REST आर्किटेक्चर की सुविधा देने वाली वेब सेवाओं को RESTful सेवाएं कहा जाता है. RESTful वेब सेवाओं को स्टैंडर्ड वेब कॉम्पोनेंट और प्रोटोकॉल का इस्तेमाल करके बनाया जाता है.
  • यूआरआई के ज़रिए, स्टैंडर्ड तरीके से REST वेब सर्विस से अनुरोध किया जाता है.
  • किसी वेब सेवा का इस्तेमाल करने के लिए, ऐप्लिकेशन को नेटवर्क कनेक्शन बनाना होगा और सेवा से कम्यूनिकेट करना होगा. इसके बाद, ऐप्लिकेशन को जवाब का डेटा मिलना चाहिए. साथ ही, उसे ऐसे फ़ॉर्मैट में पार्स करना चाहिए जिसका इस्तेमाल ऐप्लिकेशन कर सके.
  • Retrofit लाइब्रेरी, एक क्लाइंट लाइब्रेरी है. इसकी मदद से, आपका ऐप्लिकेशन REST वेब सर्विस से अनुरोध कर सकता है.
  • कन्वर्टर का इस्तेमाल करके, Retrofit को यह बताएं कि उसे वेब सर्विस को भेजे गए डेटा और वेब सर्विस से मिले डेटा का क्या करना है. उदाहरण के लिए, ScalarsConverter कनवर्टर, वेब सेवा के डेटा को String या अन्य प्रिमिटिव के तौर पर मानता है.
  • अपने ऐप्लिकेशन को इंटरनेट से कनेक्ट करने की अनुमति देने के लिए, Android मेनिफ़ेस्ट में "android.permission.INTERNET" अनुमति जोड़ें.

JSON पार्सिंग

  • वेब सर्विस से मिलने वाला रिस्पॉन्स अक्सर JSON फ़ॉर्मैट में होता है. यह स्ट्रक्चर्ड डेटा को दिखाने के लिए, इंटरचेंज का एक सामान्य फ़ॉर्मैट है.
  • JSON ऑब्जेक्ट, की-वैल्यू पेयर का कलेक्शन होता है. इस कलेक्शन को कभी-कभी डिक्शनरी, हैश मैप या एसोसिएटिव ऐरे भी कहा जाता है.
  • JSON ऑब्जेक्ट के कलेक्शन को JSON ऐरे कहा जाता है. आपको वेब सेवा से JSON ऐरे के तौर पर जवाब मिलता है.
  • की-वैल्यू पेयर में मौजूद कुंजियों को कोटेशन मार्क में रखा जाता है. वैल्यू, संख्याएं या स्ट्रिंग हो सकती हैं. स्ट्रिंग भी कोटेशन के बीच में मौजूद होती हैं.
  • Moshi लाइब्रेरी, Android JSON पार्सर है. यह JSON स्ट्रिंग को Kotlin ऑब्जेक्ट में बदलता है. Retrofit में एक ऐसा कनवर्टर होता है जो Moshi के साथ काम करता है.
  • Moshi, JSON रिस्पॉन्स में मौजूद कुंजियों को डेटा ऑब्जेक्ट में मौजूद उन प्रॉपर्टी से मैच करता है जिनका नाम एक जैसा होता है.
  • किसी कुंजी के लिए किसी दूसरे प्रॉपर्टी नेम का इस्तेमाल करने के लिए, उस प्रॉपर्टी को @Json एनोटेशन और JSON कुंजी के नाम के साथ एनोटेट करें.

Retrofit और कोरूटीन

  • कॉल अडैप्टर की मदद से, Retrofit ऐसे एपीआई बना सकता है जो डिफ़ॉल्ट Call क्लास के अलावा कुछ और दिखाते हैं. Call को कोरूटीन Deferred से बदलने के लिए, CoroutineCallAdapterFactory क्लास का इस्तेमाल करें.
  • Deferred ऑब्जेक्ट पर await() तरीके का इस्तेमाल करें, ताकि आपका कोरूटीन कोड तब तक इंतज़ार करे, जब तक वैल्यू तैयार न हो जाए. इस दौरान, कोड ब्लॉक नहीं होगा. इसके बाद, वैल्यू वापस कर दी जाएगी.

Udacity का कोर्स:

Android डेवलपर का दस्तावेज़:

Kotlin का दस्तावेज़:

अन्य:

इस सेक्शन में, उन छात्र-छात्राओं के लिए होमवर्क असाइनमेंट की सूची दी गई है जो किसी शिक्षक के कोर्स के हिस्से के तौर पर इस कोडलैब पर काम कर रहे हैं. शिक्षक के पास ये विकल्प होते हैं:

  • अगर ज़रूरी हो, तो होमवर्क असाइन करें.
  • छात्र-छात्राओं को बताएं कि होमवर्क असाइनमेंट कैसे सबमिट किए जाते हैं.
  • होमवर्क असाइनमेंट को ग्रेड दें.

शिक्षक इन सुझावों का इस्तेमाल अपनी ज़रूरत के हिसाब से कर सकते हैं. साथ ही, वे चाहें, तो कोई दूसरा होमवर्क भी दे सकते हैं.

अगर आपको यह कोडलैब खुद से पूरा करना है, तो अपनी जानकारी की जांच करने के लिए, इन होमवर्क असाइनमेंट का इस्तेमाल करें.

इन सवालों के जवाब दें

पहला सवाल

वेब सर्विस एपीआई बनाने के लिए, Retrofit को किन दो मुख्य चीज़ों की ज़रूरत होती है?

▢ वेब सेवा के लिए बेस यूआरआई और GET क्वेरी.

▢ वेब सेवा के लिए बेस यूआरआई और कनवर्टर फ़ैक्ट्री.

▢ वेब सेवा से कनेक्ट करने के लिए नेटवर्क कनेक्शन और अनुमति देने वाला टोकन.

▢ कनवर्टर फ़ैक्ट्री और रिस्पॉन्स के लिए पार्सर.

दूसरा सवाल

Moshi लाइब्रेरी का मकसद क्या है?

▢ वेब सेवा से डेटा वापस पाने के लिए.

▢ वेब सर्विस का अनुरोध करने के लिए, Retrofit के साथ इंटरैक्ट करना.

▢ वेब सेवा से मिले JSON रिस्पॉन्स को Kotlin डेटा ऑब्जेक्ट में पार्स करने के लिए.

▢ JSON रिस्पॉन्स में मौजूद कुंजियों से मेल खाने के लिए, Kotlin ऑब्जेक्ट का नाम बदलें.

तीसरा सवाल

Retrofit कॉल अडैप्टर का इस्तेमाल किस लिए किया जाता है?

▢ ये Retrofit को कोरूटीन इस्तेमाल करने की अनुमति देते हैं.

▢ ये वेब सेवा के जवाब को Kotlin डेटा ऑब्जेक्ट में बदल देते हैं.

▢ ये Retrofit कॉल को वेब सर्विस कॉल में बदल देते हैं.

▢ ये Retrofit में, डिफ़ॉल्ट Call क्लास के अलावा किसी और क्लास से डेटा वापस पाने की सुविधा जोड़ते हैं.

अगला लेसन शुरू करें: 8.2 इंटरनेट से इमेज लोड करना और उन्हें दिखाना

इस कोर्स में मौजूद अन्य कोडलैब के लिंक के लिए, Android Kotlin Fundamentals कोडलैब का लैंडिंग पेज देखें.