2012-12-10 17 views
9

This answer मुझे बताता है कि recycle() टाइपिंगएरे की विधि को कचरा इकट्ठा करने की अनुमति देता है। मेरा सवाल यह है कि TypedArray को कचरा इकट्ठा करने के लिए विशेष रूप से एक विधि की आवश्यकता क्यों है? नियमित वस्तु की तरह एकत्रित कचरा होने का इंतजार क्यों नहीं कर सकता?टाइप किए गए ऐरे को पुनर्नवीनीकरण क्यों किया जाना चाहिए?

उत्तर

5

यह कैशिंग पर्सिंग के लिए आवश्यक है। जब आप recycle पर कॉल करते हैं तो इसका अर्थ यह है कि इस ऑब्जेक्ट को इस बिंदु से पुन: उपयोग किया जा सकता है। आंतरिक रूप से TypedArray में कुछ एरे होते हैं ताकि प्रत्येक बार स्मृति आवंटित न किया जाए जब TypedArray का उपयोग किया जाता है, यह Resources कक्षा में स्थिर क्षेत्र के रूप में कैश किया जाता है। आप TypedArray.recycle() विधि कोड देख सकते हैं:

/** 
* Give back a previously retrieved StyledAttributes, for later re-use. 
*/ 
public void recycle() { 
    synchronized (mResources.mTmpValue) { 
     TypedArray cached = mResources.mCachedStyledAttributes; 
     if (cached == null || cached.mData.length < mData.length) { 
      mXml = null; 
      mResources.mCachedStyledAttributes = this; 
     } 
    } 
} 

तो जब आप फोन recycle अपने TypedArray वस्तु बस वापस कैश करने के लिए दिया जाता है।

+1

/** * TypedArray, एक बाद की कॉल करने वाले को करने के लिए फिर से इस्तेमाल किया जा रीसायकल। पर कॉल करने के बाद * यह फ़ंक्शन आपको कभी भी टाइप किए गए सरणी को कभी भी स्पर्श नहीं करना चाहिए। */ सार्वजनिक शून्य रीसायकल() { अगर (mRecycled) { नया रनटाइम अपवाद (टूस्ट्रिंग() + "दो बार पुनर्नवीनीकरण" फेंक दें;); } mRecycled = true; // ये ग्राहक द्वारा निर्धारित किए जा सकते हैं। एमएक्सएमएल = शून्य; mTheme = null; mResources.mTypedArrayPool.release (यह); } – Sam003

2

@Andrei Mankevich मैं बस एंड्रॉइड एसडीके का नवीनतम संस्करण देखता हूं, और ऐसा लगता है कि रीसायकल() में कुछ बदलाव किए गए हैं। जांच करें नीचे कोड:

/** 
* Recycle the TypedArray, to be re-used by a later caller. After calling 
* this function you must not ever touch the typed array again. 
*/ 
public void recycle() { 
    if (mRecycled) { 
     throw new RuntimeException(toString() + " recycled twice!"); 
    } 

    mRecycled = true; 

    // These may have been set by the client. 
    mXml = null; 
    mTheme = null; 

    mResources.mTypedArrayPool.release(this); 
} 
संबंधित मुद्दे