java - जावा और एंड्रॉइड विकास में वीक रेफरेंस का उपयोग कैसे करें?




android weak-references (3)

मैं 2 साल के लिए एक जावा डेवलपर रहा हूँ।

लेकिन मैंने कभी भी अपने कोड में वीक रेफरेंस नहीं लिखा है। मेरे आवेदन को अधिक कुशल बनाने के लिए वीक रेफरेंस का उपयोग कैसे करें विशेष रूप से एंड्रॉइड एप्लिकेशन?

https://code.i-harness.com


एक "canonicalized" मैपिंग वह जगह है जहां आप स्मृति में प्रश्न में वस्तु का एक उदाहरण रखते हैं और अन्य सभी पॉइंटर्स या somesuch तंत्र के माध्यम से उस विशेष उदाहरण को देखते हैं। यह वह जगह है जहां कमजोर संदर्भ मदद कर सकते हैं। संक्षिप्त जवाब यह है कि वीक रेफरेंस ऑब्जेक्ट्स का उपयोग आपके सिस्टम में ऑब्जेक्ट्स के पॉइंटर्स बनाने के लिए किया जा सकता है, जबकि वे ऑब्जेक्ट्स को कचरे से बाहर निकलने के बाद कचरे के कलेक्टर द्वारा पुनः प्राप्त करने की इजाजत देते हैं। उदाहरण के लिए यदि मेरे पास कोड था:

class Registry {
     private Set registeredObjects = new HashSet();

     public void register(Object object) {
         registeredObjects.add( object );
     }
 }

मेरे द्वारा पंजीकृत कोई भी वस्तु जीसी द्वारा कभी भी पुनः दावा नहीं की जाएगी क्योंकि पंजीकृत ऑब्जेक्ट्स के सेट में संग्रहीत इसका संदर्भ है। दूसरी तरफ अगर मैं ऐसा करता हूं:

class Registry {
     private Set registeredObjects = new HashSet();

     public void register(Object object) {
         registeredObjects.add( new WeakReference(object) );
     }
 }

फिर जब जीसी सेट में ऑब्जेक्ट्स को पुनः प्राप्त करना चाहता है तो यह ऐसा करने में सक्षम होगा। आप इस तकनीक का उपयोग कैशिंग, कैटलॉगिंग इत्यादि के लिए कर सकते हैं। जीसी और कैशिंग के बारे में अधिक गहन चर्चाओं के संदर्भों के लिए नीचे देखें।

रेफरी: कचरा कलेक्टर और वीक रेफरेंस


कुछ अन्य उत्तरों अपूर्ण या अत्यधिक लंबे प्रतीत होते हैं। यहां एक सामान्य उत्तर है।

जावा और एंड्रॉइड में वीक रेफरेंस का उपयोग कैसे करें

आप निम्न चरणों का पालन कर सकते हैं:

  1. एक WeakReference चर बनाएँ
  2. कमजोर संदर्भ सेट करें
  3. कमजोर संदर्भ का प्रयोग करें

कोड

MyClass पास AnotherClass कमजोर संदर्भ है।

public class MyClass {

    // 1. Create a WeakReference variable
    private WeakReference<AnotherClass> mAnotherClassReference;

    // 2. Set the weak reference
    void someMethod(AnotherClass object) {
        mAnotherClassReference = new WeakReference<>(object);
    }

    // 3. Use the weak reference
    void anotherMethod() {
        AnotherClass object = mAnotherClassReference.get();
        if (object == null) return;
        // do something with the object
    }

}

MyClass पास MyClass का एक मजबूत संदर्भ है।

public class AnotherClass {

    // strong reference
    MyClass mMyClass;

    // allow MyClass to get a weak reference to this class
    void someMethod() {
        mMyClass = new MyClass();
        mMyClass.someMethod(this);
    }
}

टिप्पणियाँ

  • कमजोर संदर्भ की आवश्यकता के कारण यह है कि कचरा कलेक्टर ऑब्जेक्ट्स का निपटान कर सकता है जब उन्हें अब आवश्यकता नहीं होती है। यदि दो वस्तुएं एक-दूसरे के लिए एक मजबूत संदर्भ बनाए रखती हैं, तो वे एकत्रित कचरा नहीं हो सकते हैं। यह एक स्मृति रिसाव है।
  • यदि दो वस्तुओं को एक-दूसरे को संदर्भित करने की आवश्यकता है, तो ऑब्जेक्ट ए (आमतौर पर कम जीवित वस्तु) को ऑब्जेक्ट बी (आमतौर पर लंबे समय तक जीवित वस्तु) के लिए कमजोर संदर्भ होना चाहिए, जबकि बी के ऊपर एक मजबूत संदर्भ है। ऊपर दिए गए उदाहरण में, MyClass था ए और एक और AnotherClass बी था
  • एक WeakReference का उपयोग करने का एक विकल्प है कि एक और वर्ग इंटरफ़ेस को कार्यान्वित करे। यह श्रोता / पर्यवेक्षक पैटर्न में किया जाता है।

व्यावहारिक उदाहरण

  • स्टेटिक आंतरिक AsyncTask कक्षा

एंड्रॉइड में WeakReference का उपयोग करना सादे पुराने जावा में से किसी एक का उपयोग करने से अलग नहीं है। यहां एक महान गाइड है जो एक विस्तृत स्पष्टीकरण देता है: कमजोर संदर्भों को समझना

जब भी आपको किसी ऑब्जेक्ट के संदर्भ की आवश्यकता होती है, तो आपको किसी का उपयोग करने के बारे में सोचना चाहिए, लेकिन आप ऑब्जेक्ट को कचरा कलेक्टर से बचाने के संदर्भ को नहीं चाहते हैं। एक क्लासिक उदाहरण एक कैश है जिसे आप कचरा बनना चाहते हैं जब स्मृति उपयोग बहुत अधिक हो जाता है (अक्सर WeakHashMap साथ लागू किया जाता है)।

SoftReference और PhantomReference को भी SoftReference सुनिश्चित करें।

संपादित करें: टॉम ने WeakHashMap साथ कैश को लागू करने पर कुछ चिंताओं को उठाया है। यहां समस्याएं डालने वाला एक लेख दिया गया है: WeakHashMap कैश नहीं है!

टॉम सही है कि WeakHashMap कैशिंग के कारण खराब नेटबीन प्रदर्शन के बारे में complaints हैं।

मुझे अभी भी लगता है कि यह WeakHashMap साथ कैश को लागू करने के लिए एक अच्छा सीखने का अनुभव होगा और उसके बाद SoftReference साथ लागू अपने हाथ से लुढ़का हुआ कैश के खिलाफ इसकी तुलना करें। असली दुनिया में, आप शायद इन समाधानों में से किसी एक का उपयोग नहीं करेंगे, क्योंकि यह अपाचे जेसीएस जैसी तीसरी पार्टी लाइब्रेरी का उपयोग करने के लिए अधिक समझ में आता है।





weak-references