2010-12-15 15 views
20

मैं अपने ListActivityगतिविधि OnDestroy कभी नहीं बुलाया?

// a separate class in project 
public class MyActivity extends ListActivity { 
    // some common functions here.. 
} 

public class SelectLocation extends MyListActivity { 

    public void onCreate(Bundle savedInstance) { 
     // here..... 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if (adap != null) adap = null; 
     if (list != null) list = null; 
     System.gc(); 
    } 
} 

में निम्नलिखित कोड का उपयोग कर रहा किसी भी एक मेरा मार्गदर्शन क्यों onDestroy विधि मेरे कोड में नहीं बुलाया जाता है?

+5

यदि चेक अनिवार्य हैं - 'adap = list = null; ' –

उत्तर

51

onDestroy() केवल तब कहा जाता है जब संसाधन संसाधनों (मेमोरी, सीपीयू समय और इतने पर) पर कम होता है और आपकी गतिविधि/एप्लिकेशन को मारने का निर्णय लेता है या जब कोई आपकी गतिविधि पर finish() पर कॉल करता है।

तो, अपने कोड() का परीक्षण करने के लिए आप एक परीक्षण बटन बना सकते हैं, जो आपकी गतिविधि पर finish() पर कॉल करेगा।

और पढ़ें here

इसके अलावा, मुझे विश्वास है कि आपको onDestroy() में इन सभी चीजों को कॉल करने की आवश्यकता नहीं है जब तक कि एडैप एक महत्वपूर्ण संसाधन नहीं है। और यहां तक ​​कि उस मामले में एंड्रॉइड सिस्टम में उन्हें व्यवस्थित करने के लिए तंत्र हैं।

+0

ऑनड्रॉयरो को न केवल संसाधनों पर कम होने पर ही बुलाया जाता है। यह तब भी कहा जाता है जब 'गतिविधि' अब तक पहुंच योग्य नहीं है –

+1

जब भी आप डिवाइस को घुमाते हैं तो इसे भी घुमाया जाता है क्योंकि इसकी विशेषताओं में बदलाव आया है (यानी अभिविन्यास) जो संसाधनों का उपयोग कर सकता है, जिससे यह नष्ट हो जाता है, इसलिए यह गतिविधि को नष्ट कर देता है और बनाता है। ऑनस्ट्रोय() के बाद क्रिएट() को कॉल किया जाता है। –

24

कोई गारंटी नहीं है कि आपकी onDestroy विधि बिल्कुल भी कॉल की जाएगी।

आपके द्वारा उपयोग किए जाने वाले कोड को आपके ऑनस्ट्राय विधि में बिल्कुल भी आवश्यक नहीं है। यदि विनाश कहा जाता है तो आपकी अखंडता को ढेर से हटा दिया जाएगा और कचरा संग्रह के लिए स्वतंत्र है, वैसे भी इसमें सभी संसाधनों के साथ ही गतिविधि द्वारा संदर्भित किया जाता है। System.gc() भी खराब शैली माना जाता है। एंड्रॉइड पर सिस्टम लगभग हमेशा जानता है कि कचरा संग्रह करने का सबसे अच्छा समय कब होता है। अधिकांश बार एक गतिविधि कचरा संग्रह खत्म होती है स्वचालित रूप से ट्रिगर होती है। बस पूरे onDestroy विधि को हटा दें। अगर आपको अपने आवेदन की समग्र स्मृति में समस्याएं हैं तो समस्या कहीं और है।

+5

इसकी तरह मजाकिया है, लेकिन यहां की छवि का कहना है कि ऑनस्ट्रॉय को हमेशा बुलाया जाएगा। यदि आप पाठ पढ़ते हैं, तो यह भी कहा जाता है: "कॉल के बीच एक गतिविधि का पूरा जीवनकाल होता है() और कॉल को ऑनस्ट्राय() पर कॉल करता है।" http://developer.android.com/guide/topics/fundamentals/activities.html# लाइफसाइकिल – Ted

+1

हां प्रलेखन की शुरुआत में और छवि को यह स्पष्ट रूप से नहीं दिखाया गया है कि ऑनस्ट्राय को बुलाया नहीं जा सकता है। यह केवल बाद में उल्लेख किया गया है जबकि छवि के नीचे तालिका के हिस्से के बाद मारने योग्य है समझाया गया है। यदि आपके पास छवि पर केवल एक नज़र है तो आपको गुमराह किया जा सकता है। – Janusz

+0

असल में, आप टेक्स्ट का थोड़ा सा पढ़ सकते हैं, और स्पष्ट इंप्रेशन प्राप्त कर सकते हैं कि ऑनस्ट्राय को हमेशा बुलाया जाता है। "टेबल 1" को देखें: [onDestroy] गतिविधि नष्ट होने से पहले बुलाया गया। यह अंतिम कॉल है कि गतिविधि प्राप्त होगी। – Ted

5

अधिकांश फोन में जब बैक बटन दबाया जाता है वहां दो बार स्टॉप() और ऑनस्ट्रोय() विधियों पर कॉल किया जाता है, लेकिन यदि यह आपका मामला नहीं है, तो आप फिनिश() को आमंत्रित करने के लिए एक बटन बना सकते हैं; तरीका।

संबंधित मुद्दे