AndroidViewModel बनाम ViewModel


159

एंड्रॉइड आर्किटेक्चर कंपोनेंट्स लाइब्रेरी की शुरुआत के साथ, कई नई कक्षाएं शुरू की गईं, जिनमें शामिल हैं AndroidViewModelऔर ViewModel। हालाँकि, मुझे इन दोनों वर्गों के बीच के अंतर का पता लगाने में परेशानी हो रही है। प्रलेखन संक्षेप का वर्णन AndroidViewModelइस प्रकार है:

आवेदन प्रसंग से अवगत कराया ViewModel

मैं संक्षिप्तता की सराहना करता हूं, लेकिन वास्तव में इसका क्या मतलब है? जब हम उपयोग करने के लिए चुनना चाहिए AndroidViewModelसे अधिक ViewModelऔर उपाध्यक्ष प्रतिकूल?

जवाबों:


223

AndroidViewModel एप्लिकेशन संदर्भ प्रदान करता है

यदि आपको अपने Viewmodel के अंदर संदर्भ का उपयोग करने की आवश्यकता है, तो आपको AndroidViewModel (AVM) का उपयोग करना चाहिए, क्योंकि इसमें एप्लिकेशन संदर्भ होता है। संदर्भ कॉल को पुनः प्राप्त करने के लिए getApplication(), अन्यथा नियमित ViewModel (VM) का उपयोग करें।

AndroidViewModel में एप्लिकेशन संदर्भ है । हम सभी जानते हैं कि स्थैतिक संदर्भ उदाहरण होना बुरी बात है क्योंकि इससे मेमोरी लीक हो सकती है !! हालाँकि, स्थैतिक अनुप्रयोग इंस्टेंस होना उतना बुरा नहीं है जितना आप सोच सकते हैं क्योंकि रनिंग एप्लिकेशन में केवल एक एप्लीकेशन इंस्टेंस है।

इसलिए, किसी विशिष्ट वर्ग में एप्लिकेशन का उपयोग करना और उसका उपयोग करना सामान्य समस्या नहीं है। लेकिन, यदि कोई एप्लिकेशन उदाहरण उन्हें संदर्भित करता है, तो यह संदर्भ चक्र समस्या के कारण एक समस्या है।

एप्लिकेशन इंस्टेंस के बारे में भी देखें

यूनिट परीक्षण के लिए AndroidViewModel समस्याग्रस्त

एवीएम आवेदन संदर्भ प्रदान करता है जो इकाई परीक्षण के लिए समस्याग्रस्त है। यूनिट परीक्षणों को संदर्भ के रूप में किसी भी एंड्रॉइड जीवनचक्र से संबंधित नहीं होना चाहिए।


42
हमेशा AndroidViewModel का उपयोग क्यों नहीं किया जाता है? आपको बाद में संदर्भ की आवश्यकता हो सकती है, भले ही आपको इसकी आवश्यकता न हो। क्या इसका कोई नकारात्मक पहलू है?
टी। रेक्स

20
@ T.Rex यदि आप कोड को देखते हैं, तो यह ViewModelकेवल अनुप्रयोग की ओर इशारा करते हुए एक क्षेत्र के साथ विस्तारित होता है। अगर मुझे इसकी आवश्यकता नहीं है, तो मुझे Applicationपैरामीटर (जिसकी AndroidViewModelआवश्यकता है) के साथ एक अनिवार्य कंस्ट्रक्टर होना पसंद नहीं है और केवल उपयोग करना है ViewModel। जब मुझे भविष्य में एक संदर्भ की आवश्यकता होती है, तो मैं इसे आसानी से बदल सकता हूं।
लड़का

3
का प्रयोग करें ViewModelजब आप टुकड़ा के साथ या साझा करने के लिए इसका उपयोग करना चाहते ViewModelएक ही गतिविधि के विभिन्न टुकड़ों के बीच।
कोडेलनर

22
@ T.Rex का उपयोग नहीं होगा AndroidViewModel- Contextनिर्भर होने के नाते - यह एक नियमित इकाई परीक्षण में परीक्षण करना असंभव है, केवल एक संभावना के रूप में इंस्ट्रूमेंटेशन परीक्षण छोड़कर? मैंने खुद इसके साथ (अभी तक)
खिलवाड़

2
AndroidViewModel और ViewModel समान है, केवल अंतर यह है कि AndroidViewModel में एप्लिकेशन संदर्भ है। MediaMore से डेटा लोड करने, या एप्लिकेशन संदर्भ के साथ AndroidViewModel का उपयोग करने के लिए आप ViewModel का उपयोग कर सकते हैं और ViewModel के संदर्भ को पास कर सकते हैं।
एलेक्स

10

अंत में मुझे कुछ सरल स्पष्टीकरण मिला, थोड़ा ...... ...... AndroidViewModel क्लास ViewModel का उपवर्ग है और उनके समान, वे UI से संबंधित डेटा को संग्रहीत और प्रबंधित करने के लिए डिज़ाइन किए गए हैं जो डेटा तैयार करने और प्रदान करने के लिए जिम्मेदार हैं UI के लिए और स्वचालित रूप से डेटा को कॉन्फ़िगरेशन परिवर्तन से बचने की अनुमति देता है।

AndroidViewModel के साथ एकमात्र अंतर यह है कि यह एप्लिकेशन संदर्भ के साथ आता है, जो आपको सिस्टम सेवा प्राप्त करने के लिए संदर्भ की आवश्यकता होती है या समान आवश्यकता होती है। बोल्ड टेक्स्ट इसे समझ में आता है।


1
आधिकारिक स्रोत medium.com/androiddevelopers/...
नीरज Sewani

4

AndroidViewModel ViewModel का उपवर्ग है । उनके बीच का अंतर यह है कि हम एप्लिकेशन प्रसंग को पारित कर सकते हैं, जिसका उपयोग तब किया जा सकता है जब भी अनुप्रयोग प्रसंग आवश्यक हो, उदाहरण के लिए रिपॉजिटरी में डेटाबेस को तत्काल करना।

AndroidViewModel एक एप्लिकेशन संदर्भ है, जो ViewModel से अवगत है।

AndroidViewModel:

public class PriceViewModel extends AndroidViewModel {
private PriceRepository priceRepository;

public PriceViewModel(@NonNull Application application) {
    super(application);
    priceRepository= new PriceRepository(application);
    allPrices = priceRepository.getAllPrices();
}

ViewModel:

public class PriceViewModel extends ViewModel {
public PriceViewModel() {
    super();
}

जब आपको एप्लिकेशन संदर्भ की आवश्यकता होती है, तो आपको AndroidViewModel का उपयोग करना चाहिए ।

आपको कभी भी गतिविधि के संदर्भ या दृश्य को संग्रहीत नहीं करना चाहिए जो कि ViewModel.Because में एक गतिविधि का संदर्भ देता है। ViewModel एक गतिविधि को रेखांकित करने के लिए डिज़ाइन किया गया है और यह मेमोरी लीक का कारण होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.