java - अनाम वर्ग के निर्माणकर्ता में अंतिम वस्तु के संदर्भ में एक रिसाव?




android memory-leaks (2)

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

यह कहने के बाद, इसका मतलब है कि वास्तव में उदाहरण क्षेत्रों (आपके रननबल में) बाहरी दायरे के सभी एक्सेस किए गए चर की प्रतियां हैं। आपके उदाहरण में, यह FragMyDrive संदर्भ में भी होगा क्योंकि आप बस इसे एक्सेस कर रहे हैं।

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

आप वास्तव में क्या जरूरत है उन संदर्भों को कम करने के लिए हमेशा एक अच्छा विचार है:

private static void fg_downloadFile(final FragMyDrive frag, final File file, final Drive drive){
    final String key = frag.getCastedActivity().getKey();
    final Context context = frag.getCastedActivity().mService;

    Runnable rx_downloadFile = new Runnable() {
        @Override
        public void run() {
            bg_downloadFile(context, key, file, drive);
        }
    }; 
    //.... Submit runnable to service...
}

यहां केवल (अंतर्निहित रूप से उत्पन्न) इंस्टेंस फ़ील्ड हैं:

String key
Context context
File file
Drive drive

मैं एक सेवा के लिए एक runnable पारित कर रहा हूँ रननेबल अवधि उस अंश / गतिविधि से निकल सकती है जो उसे पास करती है। मैं सोच रहा हूं कि क्या निम्न कोड स्निपेट रननबल के भीतर एक संदर्भ बनाए रखने से frag ऑब्जेक्ट रिसाव करेगा? मुझे एहसास हुआ कि मैं पूरी तरह से बाहर की रेखा को स्थानांतरित कर सकता हूँ जिसमें सुरंग के बाहर (जैसा कि मैंने "स्ट्रिंग कुंजी = फ्रैग ..." के साथ किया था), लेकिन मैं यह समझने के लिए बस पूछ रहा हूँ कि कैसे / जब एक गुमनाम वर्ग लीक करेगा वस्तु।

मैं वास्तव में निश्चित नहीं हूँ चलाने के लिए केवल आवेश को आरम्भ करने पर एक चर का निर्धारण करने की आवश्यकता होती है, और यहां इन-लाइन को आरम्भिक किया गया है इसलिए सिद्धांत रूप में, इन-लाइन उदाहरण बनाने के बाद इसे किसी भी संदर्भ के लिए frag की कोई ज़रूरत नहीं है।

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

private static void fg_downloadFile(final FragMyDrive frag, final File file, final Drive drive){

    final String key = frag.getCastedActivity().getKey();

    Runnable rx_downloadFile = new Runnable() {

        Context ServiceContext = frag.getCastedActivity().mService;

        @Override
        public void run() {

            bg_downloadFile(ServiceContext, key, file, drive);
        }
    }; 

    //.... Submit runnable to service...
}

दिलचस्प सवाल क्या आपको प्रोग्रामिंग में स्वत: कचरा संग्रह के बिना कुछ अनुभव है, जैसे उद्देश्य सी?

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

चूंकि कचरा संग्रह काम करता है, एक बार वस्तु का संदर्भ नहीं दिया जाता है, यह कचरा संग्रहण और डिलोकेटेड होगा।





anonymous-class