2012-10-12 27 views
6

क्या मैं सुपर या ऑनस्ट्राय() के बाद आदेशों को रख सकता हूं जब किसी गतिविधि के ऑनडस्ट्रॉय को ओवरराइट कर रहा हो?एंड्रॉइड शुरुआती: ऑनडेस्ट्राय

protected void onDestroy() { 

    //option 1: callback before or ... 

    super.onDestroy(); 

    //option 2: callback after super.onDestroy(); 
} 

(अब मुझे डर है: अगर super.onDestroy बहुत तेजी से है, यह विकल्प में 2. आने कभी नहीं होगा)

+0

मुझे नहीं लगता कि आपको 2 – njzk2

+0

तक पहुंचने से क्या रोक सकता है यह प्रश्न http://stackoverflow.com/q/18821481/53974 का एक डुप्लिकेट है, और वास्तव में इसका एक अच्छी तरह से शोध किया गया उत्तर है। http://stackoverflow.com/a/18874519/53974 – Blaisorblade

उत्तर

3
के लिए इस लिंक की जाँच का सुझाव

यह तब होता है जब आप super.onDestroy() को कॉल करते हैं;

Android Source

protected void onDestroy() { 
    mCalled = true; 

    // dismiss any dialogs we are managing. 
    if (mManagedDialogs != null) { 

     final int numDialogs = mManagedDialogs.size(); 
     for (int i = 0; i < numDialogs; i++) { 
      final Dialog dialog = mManagedDialogs.valueAt(i); 
      if (dialog.isShowing()) { 
       dialog.dismiss(); 
      } 
     } 
    } 

    // also dismiss search dialog if showing 
    // TODO more generic than just this manager 
    SearchManager searchManager = 
     (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    searchManager.stopSearch(); 

    // close any cursors we are managing. 
    int numCursors = mManagedCursors.size(); 
    for (int i = 0; i < numCursors; i++) { 
     ManagedCursor c = mManagedCursors.get(i); 
     if (c != null) { 
      c.mCursor.close(); 
     } 
    } 
} 

अनिवार्य रूप से इसका मतलब है कि यह कोई बात नहीं अगर आप इसे से पहले या अपने कोड के बाद कहते हैं।

+0

क्या इसका मतलब यह भी है कि मुझे गतिविधि के ऑनस्ट्रॉय के लिए "खारिज()" कॉल करने की आवश्यकता नहीं है? मुझे लगता है मुझे याद है कि उन्हें लीक करने के लॉग थे, नहीं? किस मामले में रिसाव होते हैं? –

+1

डिसमिस केवल संवाद के लिए है और इस प्रश्न से असंबंधित है क्योंकि एक संवाद के मुकाबले एक अलग जीवन चक्र होता है। यदि आपके पास संवाद समस्याएं हैं तो आपको एक नया प्रश्न शुरू करना चाहिए ताकि आपके जारी को बेहतर तरीके से संबोधित किया जा सके। –

+0

लेकिन यह इससे संबंधित है, क्योंकि यह पूछता है कि इसमें कहां रखा जाए, और आपने अपना कोड दिखाया है। लगता है कि कोड संवाद तंत्र को खारिज कर रहा है –

7

कोई भी चीज जो गतिविधि संसाधनों का उपयोग कर super.onDestroy() को कॉल करने से पहले किया जाना चाहिए से संबंधित हो सकती । इसके बाद वाला कोड बी तक पहुंच जाएगा, लेकिन अगर उन संसाधनों की आवश्यकता हो तो समस्याएं हो सकती हैं।

+0

एंड्रॉइड डेवलपर मैनुअल कहीं भी इसकी अनुशंसा नहीं करता है :-(मैंने दस्तावेज़ों को घंटों के लिए खोजा है ... – ledy

0

यह निर्भर करता है। यदि आप super फ़ंक्शन के बाद अपने कार्यों को लागू करना चाहते हैं, तो आपको सुपर के बाद अपना फ़ंक्शन रखना चाहिए। मुझे लगता है कि आपको पहले super के उपयोग को समझना होगा। उदाहरण के लिए, super.onDestroy(); जैसे के बाद अपने कोड पर this question

3

प्लेस एक बार देख ले:

protected void onDestroy() { 
    super.onDestroy(); 

    // Put code here. 

} 

आपका कोड जब विधि अधिभावी क्रियान्वित खत्म हो जाएगा।

+1

मैं testActivity.Instance.InfoThatIAmComingBackToTheMainActivityNow को कॉल करने जा रहा हूं() – ledy

0

यह विकल्प 2 में पहुंच जाएगा। OnDestroy() वास्तव में वस्तु को नष्ट नहीं करता है। सुपरक्लास के ऑनस्ट्रोय() रन और रिटर्न के बाद आपका उदाहरण अभी भी जिंदा है।

संपादित करें: इस OnDestroy क्रम में क्या करता है:

  • किसी भी संवाद गतिविधि प्रबंध किया गया था को खारिज करें।
  • गतिविधि का प्रबंधन करने वाले किसी भी कर्सर को बंद करें।
  • किसी भी खुले खोज संवाद
+0

यानी यदि डिवाइस पर्याप्त तेज़ था, तो विकल्प 2 के साथ आने से पहले एक संदर्भ या कर्सर भी चलाया जा सकता था? – ledy

1

super.onDestroy कॉलिंग बुला धागे या कुछ इस तरह बाधित नहीं होगी बंद करें। Super.onDestroy से पहले या उसके बाद, आपका कोड निष्पादित किया जाएगा चाहे आप इसे कहां रखें।

super.onDestroy केवल मुक्त संसाधन है कि ढांचे द्वारा इस गतिविधि के लिए संदर्भित किया जा सकता है (जैसे प्रणाली संवादों और प्रबंधित कर्सर)

मैं आपको और अधिक जानकारी

http://developer.android.com/reference/android/app/Activity.html#onDestroy()