इसे पढ़ने के बाद मुझे ViewModels के संबंध में कुछ प्रश्नों के साथ छोड़ दिया गया था:

https://developer.android.com/topic/libraries/आर्किटेक्चर/सेविंग-स्टेट्स

यह यहां कहता है कि आपको कॉन्फ़िगरेशन परिवर्तन (जैसे स्क्रीन रोटेशन) के लिए ViewModel दोनों के संयोजन का उपयोग करना चाहिए, और अन्य सभी मामलों के लिए onSaveInstanceState() का उपयोग करना चाहिए जहां एक गतिविधि नष्ट हो जाती है और फिर इसे बचाने के लिए फिर से बनाया जाता है यूआई राज्य।

मेरा सवाल यह है कि जब onCreate(Bundle) को कॉल किया जाता है तो हम राज्य को पुनर्स्थापित करने का तरीका कैसे जानते हैं - क्या मुझे व्यूमोडेल का उपयोग करना चाहिए या क्या मुझे पैरामीटर के रूप में प्राप्त बंडल का उपयोग करना चाहिए? जब कॉन्फ़िगरेशन बदलता है, onSaveInstanceState() को भी कॉल किया जाता है, और जाहिर तौर पर onCreate() को हमेशा कॉल किया जाता है।

अगर मैं केवल व्यूमोडेल से राज्य को पुनर्स्थापित करता हूं, तो यह हमेशा सही डेटा के साथ नहीं रहेगा (चूंकि कॉन्फ़िगरेशन परिवर्तनों के अलावा अन्य कारणों से गतिविधि नष्ट हो सकती थी)। यदि मैं केवल onSaveInstanceState() में सहेजे गए बंडल का उपयोग करता हूं तो मैं ViewModel का उपयोग क्यों शुरू करूं?

13
Yonatan Nir 23 फरवरी 2019, 13:32

1 उत्तर

सबसे बढ़िया उत्तर

मुझे लगता है कि इन स्रोतों को एक श्रृंखला के रूप में सोचना अच्छा है। आपके पास डेटा के 2 स्रोत हैं - व्यूमोडेल, जो तेज़ है लेकिन कम रहता है और सहेजी गई इंस्टेंस स्थिति धीमी है लेकिन लंबे समय तक रहती है।

नियम सरल है - अपने व्यूमोडेल का उपयोग करने का प्रयास करें और यदि यह पॉप्युलेट नहीं है तो onSaveInstanceState() से बंडल का उपयोग करें।

जब आप val model = ViewModelProviders.of(this).get(MyViewModel::class.java) ऑनक्रिएट () में करते हैं, तो आप जांच सकते हैं कि क्या आपको व्यूमोडेल का एक नया उदाहरण मिलता है। फिर, यदि यह एक नया उदाहरण है (यानी इसके डेटा फ़ील्ड खाली हैं) तो आप अपने बंडल से कुछ बुनियादी डेटा प्राप्त कर सकते हैं, जैसे सामग्री आईडी, और उस आईडी के आधार पर बैकएंड या डेटाबेस से डेटा प्राप्त कर सकते हैं, इसके साथ अपना नया व्यूमोडेल पॉप्युलेट कर सकते हैं और फिर ViewModel से अपनी गतिविधि को पॉप्युलेट करें (यदि आप LiveData का उपयोग कर रहे हैं तो यह बहुत स्वाभाविक होगा)।

अगली बार onCreate को कहा जाता है कि आप प्रक्रिया को दोहराएं, या तो ViewModel से अपनी गतिविधि को पॉप्युलेट करें या बंडल में डेटा का उपयोग करके अपने ViewModel को पॉप्युलेट करें और फिर अपने ViewModel से अपनी गतिविधि को पॉप्युलेट करें।

अद्यतन: वास्तव में आधिकारिक docs में वर्णित बहुत समान दृष्टिकोण है। फर्क सिर्फ इतना है कि आप बंडल को व्यूमोडेल में पास करते हैं और यह तय करता है कि उसे डेटा लाने की जरूरत है या नहीं, मैं इस तंत्र के बारे में विशिष्ट नहीं था।

10
TpoM6oH 28 फरवरी 2019, 18:35