android - FragmentPagerAdapter और FragmentStatePagerAdapter के बीच अंतर
android-fragments android-viewpager (5)
FragmentPagerAdapter पूरे टुकड़े को मेमोरी में संग्रहीत करता है, और यदि मेमपेजर में बड़ी मात्रा में टुकड़ों का उपयोग किया जाता है तो मेमोरी ओवरहेड बढ़ा सकता है। इसके विपरीत इसके भाई, FragmentStatePagerAdapter केवल सहेजे गए इन्स्टेंसस्टेट को टुकड़े टुकड़े करता है, और फोकस खोने पर सभी टुकड़ों को नष्ट कर देता है।
इसलिए FragmentStatePagerAdapter का उपयोग तब किया जाना चाहिए जब हमें गतिशील टुकड़ों का उपयोग करना होगा, जैसे विगेट्स के साथ टुकड़े, क्योंकि उनके डेटा को सहेजे गए इन्स्टेंसस्टेट में संग्रहीत किया जा सकता है। बड़ी संख्या में टुकड़े होने पर भी यह प्रदर्शन को प्रभावित नहीं करेगा। इसके विपरीत जब हम पूरे टुकड़े को स्मृति में स्टोर करने की आवश्यकता होती है तो इसके भाई FragmentPagerAdapter का उपयोग किया जाना चाहिए। जब मैं कहता हूं कि पूरा टुकड़ा स्मृति में रखा जाता है तो इसका मतलब है, इसके उदाहरण नष्ट नहीं होंगे और एक मेमोरी ओवरहेड बनाएंगे।
इसलिए इसे केवल FragmentPagerAdapter का उपयोग करने की सलाह दी जाती है जब ViewPager के लिए कम संख्या में टुकड़े होते हैं। अगर टुकड़े स्थैतिक होते हैं तो यह बेहतर होगा, क्योंकि उनके पास बड़ी मात्रा में ऑब्जेक्ट नहीं होंगे जिनके उदाहरण संग्रहीत किए जाएंगे। उम्मीद है कि यह एंड्रॉइड FragmentPagerAdapter और FragmentStatePagerAdapter के बीच अंतर को साफ़ करता है। अगर आपको यह लेख पसंद है तो कृपया इसे अपने दोस्तों के साथ Google+ और फेसबुक पर साझा करें, नवीनतम अपडेट के लिए फेसबुक पर हमारे पेज की तरह।
FragmentPagerAdapter
और FragmentStatePagerAdapter
बीच क्या अंतर है?
FragmentPagerAdapter
बारे में Google की मार्गदर्शिका कहती है:
पेजर का यह संस्करण तब उपयोग के लिए सबसे अच्छा होता है जब टैब के सेट जैसे आमतौर पर अधिक स्थिर टुकड़े होते हैं। उपयोगकर्ता विज़िट के प्रत्येक पृष्ठ का टुकड़ा स्मृति में रखा जाएगा, हालांकि दिखाई देने पर इसका दृश्य पदानुक्रम नष्ट हो सकता है। इसका परिणाम स्मृति की एक महत्वपूर्ण मात्रा का उपयोग कर सकता है क्योंकि खंड के उदाहरण मनमाने ढंग से राज्य की स्थिति में हो सकते हैं। पृष्ठों के बड़े सेट के लिए, FragmentStatePagerAdapter पर विचार करें।
और FragmentStatePagerAdapter
बारे में:
पेजर की यह संख्या अधिक उपयोगी होती है जब बड़ी संख्या में पेज होते हैं, जो सूची दृश्य की तरह काम करते हैं। जब उपयोगकर्ता उपयोगकर्ता के लिए दृश्यमान नहीं होते हैं, तो उनका पूरा टुकड़ा नष्ट हो सकता है, केवल उस खंड की सहेजी गई स्थिति को ही रखा जा सकता है। पेजर के बीच स्विच करते समय संभावित रूप से अधिक ओवरहेड की लागत पर FragmentPagerAdapter की तुलना में पेजर प्रत्येक विज़िट किए गए पृष्ठ से जुड़े बहुत कम स्मृति को पकड़ने की अनुमति देता है।
तो मेरे पास सिर्फ 3 टुकड़े हैं। लेकिन उनमें से सभी बड़ी मात्रा में डेटा के साथ एक अलग मॉड्यूल है।
Fragment1
कुछ डेटा (जो उपयोगकर्ता दर्ज करता है) को संभालता है और इसे गतिविधि के माध्यम से Fragment2
में पास करता है, जो कि केवल एक साधारण ListFragment
। Fragment3
भी एक ListFragment
।
तो मेरे प्रश्न हैं : मैं किस एडाप्टर का उपयोग करूँ? FragmentPagerAdapter
या FragmentStatePagerAdapter
?
FragmentStatePagerAdapter = ViewPager में बड़ी संख्या में टुकड़ों को समायोजित करने के लिए। चूंकि यह एडाप्टर खंड को नष्ट कर देता है जब यह उपयोगकर्ता के लिए दृश्यमान नहीं होता है और केवल सहेजे गए प्रवेश के आगे का उपयोग आगे बढ़ने के लिए रखा जाता है। इस तरह स्मृति की कम मात्रा का उपयोग किया जाता है और गतिशील टुकड़ों के मामले में बेहतर प्रदर्शन दिया जाता है।
दस्तावेज़ों की तरह कहते हैं, इस तरह से इस बारे में सोचो। यदि आप एक पुस्तक पाठक की तरह एक आवेदन करना चाहते थे, तो आप एक ही समय में सभी टुकड़ों को स्मृति में लोड नहीं करना चाहेंगे। उपयोगकर्ता पढ़ने के रूप में आप Fragments
लोड और नष्ट करना चाहते हैं। इस मामले में आप FragmentStatePagerAdapter
उपयोग करेंगे। यदि आप केवल 3 "टैब" प्रदर्शित कर रहे हैं जिनमें बहुत अधिक भारी डेटा नहीं है (जैसे Bitmaps
), तो FragmentPagerAdapter
आपको अच्छी तरह से अनुकूल कर सकता है। साथ ही, ध्यान रखें कि डिफ़ॉल्ट रूप से ViewPager
स्मृति में 3 टुकड़े लोड करेगा। आपके द्वारा उल्लेख किया गया पहला Adapter
View
पदानुक्रम को नष्ट कर सकता है और आवश्यकता होने पर इसे फिर से लोड कर सकता है, दूसरा Adapter
केवल Fragment
की स्थिति को बचाता है और यदि उपयोगकर्ता उस पृष्ठ पर वापस आ जाता है, तो राज्य को पुनर्प्राप्त किया जाता है।
FragmentPagerAdapter
एडाप्टर से प्राप्त किए गए पिछले डेटा को संग्रहीत करता है जबकि FragmentStatePagerAdapter
बार निष्पादित होने पर एडाप्टर से नया मान लेता है।
FragmentPagerAdapter
पूरे टुकड़े को मेमोरी में संग्रहीत करता है, और यदिViewPager
में बड़ी मात्रा में टुकड़ों का उपयोग किया जाता है तो मेमोरी ओवरहेड बढ़ा सकता है।इसके विपरीत इसके भाई,
FragmentStatePagerAdapter
केवल सहेजे गए इन्स्टेंसस्टेट को टुकड़े टुकड़े करता है, और फोकस खोने पर सभी टुकड़ों को नष्ट कर देता है।इसलिए
FragmentStatePagerAdapter
का उपयोग तब किया जाना चाहिए जब हमें गतिशील टुकड़ों का उपयोग करना होगा, जैसे विगेट्स के साथ टुकड़े, क्योंकि उनके डेटा को सहेजे गएsavedInstanceState
में संग्रहीत किया जा सकता है। इसके अलावा यह बड़ी संख्या में टुकड़े होने पर भी प्रदर्शन को प्रभावित नहीं करेगा।इसके विपरीत जब हम पूरे टुकड़े को स्मृति में स्टोर करने की आवश्यकता होती है तो इसके भाई
FragmentPagerAdapter
का उपयोग किया जाना चाहिए।जब मैं कहता हूं कि पूरा टुकड़ा स्मृति में रखा जाता है तो इसका मतलब है, इसके उदाहरण नष्ट नहीं होंगे और एक मेमोरी ओवरहेड बनाएंगे। इसलिए इसे केवल
FragmentPagerAdapter
का उपयोग करने की सलाह दी जाती है जबViewPager
लिए कम संख्या में टुकड़े होते हैं।अगर टुकड़े स्थैतिक होते हैं तो यह बेहतर होगा, क्योंकि उनके पास बड़ी मात्रा में ऑब्जेक्ट नहीं होंगे जिनके उदाहरण संग्रहीत किए जाएंगे।
अधिक जानकारी के लिए,
FragmentStatePagerAdapter:
FragmentStatePagerAdapter
साथ, आपका अनियंत्रित टुकड़ा नष्ट हो गया है। एक लेनदेन पूरी तरह से आपकी गतिविधि केFragmentManager
से टुकड़े को हटाने के लिए प्रतिबद्ध है।FragmentStatePagerAdapter
में स्थिति इस तथ्य से आती है कि यह आपके टुकड़े केBundle
को सहेजने से बचाएगा, जब इसे नष्ट कर दिया जाता है। जब उपयोगकर्ता वापस नेविगेट करता है, तो नया टुकड़ा खंड के राज्य का उपयोग करके बहाल किया जाएगा।
FragmentPagerAdapter:
तुलनात्मक रूप से
FragmentPagerAdapter
तरह के कुछ भी नहीं करता है। जब टुकड़े की आवश्यकता नहीं है।FragmentPagerAdapter
remove(Fragment)
बजाय लेनदेन परdetach(Fragment)
कहतेdetach(Fragment)
।यह खंड का दृश्य नष्ट कर देता है लेकिन
FragmentManager
मैनेजर में टुकड़े के उदाहरण को जीवित छोड़ देता है। इसलिएFragmentManager
में बनाए गएFragmentPagerAdapter
कभी नष्ट नहीं होते हैं।