2012-03-07 14 views
24

this के बजाय अक्सर वर्तमान संदर्भ के संदर्भ के लिए getBaseContext (उपयोग करना चाहिए। लेकिन, कुछ मामले में, हम क्यों getBaseContext() बजाय this उपयोग करना चाहिए। (इसका मतलब है कि this का उपयोग त्रुटि देखें)।एंड्रॉयड: क्यों) इस

Spinner spinner = (Spinner) findViewById(R.id.spinner); 
spinner.setAdapter(adapter);    
spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3){ 
     Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show(); //this line 
    } 

उपरोक्त कोड में जब मैं getBaseContext()this करने के लिए बदल त्रुटि प्राप्त करेंगे,:

यहाँ मेरी उदाहरण है।

कौन मेरे लिए व्याख्या कर सकते हैं, कृपया।

+16

'getBaseContext() 'या' getAplicationContext() 'का उपयोग न करें जब तक कि आप ** बिल्कुल और विशेष रूप से क्यों नहीं जानते ** आप इसका उपयोग क्यों कर रहे हैं। जावा के नवागंतुकों को एंड्रॉइड प्रोग्रामिंग में आने से पहले जावा सीखने में समय बिताना चाहिए, इसलिए आप 'OuterClass.this' जैसी चीजों के बारे में जानेंगे और जब आप उनकी आवश्यकता का सामना करेंगे तो उलझन में नहीं होंगे। – CommonsWare

+2

@ कॉमन्सवेयर क्या आप मुझे इसके लिए एक अच्छा लिंक दे सकते हैं। (मुझे बस 'getBaseContext() 'और' getAplicationContext' – hqt

+7

http://c2.com/cgi/wiki?InnerClass और http://docs.oracle.com/javase/tutorial/java/javaOO के बारे में पता है /nested.html और http://juixe.com/techknow/index.php/2009/04/07/java-nested-inner-class-this/ और http://stackoverflow.com/questions/56974/keyword- बाहरी-कक्षा-से-अज्ञात-आंतरिक-वर्ग – CommonsWare

उत्तर

41
  1. getApplicationContext() रिटर्न पूरा आवेदन जीवन चक्र के आवेदन के संदर्भ में कर रहे हैं का उपयोग करें देता है का उपयोग करते हैं, जब आवेदन नष्ट हो जाएगा तो यह भी नष्ट हो जाएगा।

  2. this संदर्भ गतिविधि की वर्तमान संदर्भ देता है, गतिविधि, गतिविधि तो नष्ट हो जाता है यह आपके मामले में है.लेकिन को नष्ट कर देगा यह होगा onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3) विधि के भीतर क्योंकि हम इस का उपयोग कर रहे Spinner उदाहरण के लिए संदर्भित करता से संबंध रखते हैं जो AdapterView.OnItemSelectedListener इंटरफ़ेस

  3. getBaseContext() से Spinner वर्ग और Spinner इनहेरिट इस विधि से है ContextWrapper की विधि है। और ContextWrapper (javadocs के अनुसार) "प्रसंग का प्रॉक्सी कार्यान्वयन कि बस प्रतिनिधियों एक और प्रसंग के लिए अपने कॉल के सभी। मूल प्रसंग को बदले बिना व्यवहार को संशोधित करने subclassed जा सकता है।" है, ..

और अपने मामले में: Spinner वर्ग नहीं Context के उपवर्ग या ContextWrapper वर्ग *

Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show(); 

मतलब है getBaseContext() है ContextWrapper एक की विधि है डी ContextWrapperContext का प्रॉक्सिंग कार्यान्वयन है इसलिए अप्रत्यक्ष रूप से हम एक संदर्भ कक्षा ऑब्जेक्ट पास कर रहे हैं।

या हम भी 'activity.This' पारित कर सकते हैं क्योंकि Activity वर्ग ContextWrapper वर्ग के उपवर्ग है।

अगर आप android documention साथ जाना तो इस विधि एक प्रसंग वर्ग वस्तु की आवश्यकता होती है:
public static Toast makeText (Context context, int resId, int duration)

तो हम पारित करने के लिए एक गतिविधि या वर्ग संदर्भ thisToast.makeText को जिसका मतलब है की एक उपवर्ग की जरूरत नहीं है में सक्षम नहीं हैं या तो Context या ContextWrapper कक्षा।

+2

मैंने सोचा कि "यह" OnItemSlectedListener को संदर्भित करता है - स्पिनर नहीं। नीचे सर्गेई ग्लोटोव के जवाब में। – NineToeNerd

13

आपके उदाहरण में this किसी भी संदर्भ वस्तु के लिए नव निर्मित OnItemSelectedListener को संदर्भित करता है। यदि यह कोड गतिविधि में है तो आप getBaseContext() के बजाय YourActivity.this लिख सकते हैं।

OnItemSelectedListener listener = new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3){ 
     // this.equals(listener) == true; 

     // getBaseContext() here means YourActivity.this.getBaseContext() 
     // getBaseContext() called from outer context object (activity, application, service) 
    } 
} 
+2

क्या यह सच है जब प्रत्येक धागे का अपना संदर्भ ऑब्जेक्ट होता है '? तो,' onItemSlectedListener' UIThread के विभिन्न धागे पर है, इसलिए हम 'इस' keywor का उपयोग नहीं कर सकते डी, है ना? – hqt

+0

1. AFAIK, 'onItemSlectedListener' यूआई थ्रेड पर है। 2. यह धागे से संबंधित नहीं है। ['यह 'वर्तमान ऑब्जेक्ट का संदर्भ है] (http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html)। 'OnItem चयनित()' विधि में वर्तमान ऑब्जेक्ट 'OnItemSlectedListener' है। –

3

OnItemSelected विधि इस नए OnItemSelectedListener उदाहरण है कि आप उपयोग को दर्शाता है। getBaseContext क्या आप बाहरी कक्षा है।

+2

जैसा कि मैंने सर्गेई से पूछा है, वही सवाल है, क्या यह सच है जब प्रत्येक धागे का अपना संदर्भ वस्तु है? तो, ITemSelectedListener UIThread के विभिन्न धागे पर है, इसलिए हम इस कीवर्ड का उपयोग नहीं कर सकते हैं, है ना? धन्यवाद :) – hqt

+1

AFAIK 'यह' उस उदाहरण का संदर्भ लें जहां आप हैं। यदि आप एक आंतरिक (या अज्ञात) वर्ग में हैं, तो यह उस आंतरिक वर्ग को संदर्भित करता है। कोई फर्क नहीं पड़ता कि आप धागे 1 या 30 में हैं। – louiscoquio

+0

लुइस्कोक्वियो सही है। धागे के संदर्भ के साथ कोई संबंध नहीं है। "यह" उदाहरण को संदर्भित करता है। – Raz

7

यदि यह कोड गतिविधि MyActivity पर है, तो आप getBaseContext() को MyActivity.this से भी बदल सकते हैं।

ऐसा इसलिए है क्योंकि this गतिविधि पर नहीं, OnItemSelectedListener उदाहरण को संदर्भित करता है। getBaseContext() गतिविधि संदर्भ को संदर्भित करता है।

3

आप this संदर्भित करता है OnItemSelectedListener .और अपने Interface not Class है .so यह आप त्रुटि ,,, हमेशा यदि आप गतिविधि YourActivityName.this

2

GetBaseContext() कभी-कभी एंड्रॉइड को नए कॉमर्स को भ्रमित करता है, इसके बजाय कोई भी गतिविधि नाम का उपयोग कर सकता है जो वर्तमान गतिविधि है जिसमें आप काम कर रहे हैं। इसलिए ActivityName.this getBaseContext का स्थान ले लेगा()

3

getBaseContext() बटन को क्लिक पर टोस्ट दिखाने के लिए activity.This

जैसे हम चाहते हैं को संदर्भित करता है, हम कभी नहीं उपयोगकर्ता इस हम Activty.this का उपयोग करें। ताकि जब तक हम एक ही गतिविधि पर न हों तब तक हमारा टोस्ट प्रदर्शित होता है। लेकिन अगर हम अपने टोस्ट की तुलना में getAplicationContext() का उपयोग करते हैं तो भी हम गतिविधि को स्विच करेंगे।