2013-08-14 11 views
8

के भीतर उपयोग करने के लिए सही संदर्भ शीर्षक यह सब कुछ कहता है। यदि आपके पास एक वर्ग से दूसरे में कॉलबैक है और कॉलबैक के भीतर से कुछ विधि कॉल करने की आवश्यकता है जिसके लिए संदर्भ की आवश्यकता है तो उपयोग करने के लिए सही संदर्भ क्या है? Activity या Fragment पर कॉलबैक के साथ एक सामान्य उदाहरण AsyncTask होगा जो इसका उपयोग करता था।कॉलबैक

मैं आम तौर पर getApplicationContext() का उपयोग करने से बचने की कोशिश करता हूं लेकिन मैं कॉलबैक के संदर्भ के रूप में this का उपयोग नहीं कर सकता। क्या यह एक मामला है जहां व्यापक संदर्भ का उपयोग करना उचित है?

आगे स्पष्टीकरण के लिए मैं एक AsyncTask और एक गतिविधि के बीच एक इंटरफेस के साथ एक कॉलबैक के बारे में सोच रहा हूँ। एक बार जब मैं ओवरराइड इंटरफ़ेस विधि के अंदर हूं तो मुझे वहां से गतिविधियों का संदर्भ नहीं मिल सकता है।

+1

आप से क्या मतलब है हो सकता है – tyczj

+1

मेरा मतलब है अगर मैं एक गतिविधि के भीतर कुछ के लिए एक संदर्भ की जरूरत मैं सिर्फ इस्तेमाल कर सकते हैं "कुछ नहीं आप का उपयोग' this' दे रहा है " यह एक संदर्भ के रूप में। एक टुकड़े के लिए, मैं getActivity() का उपयोग करता हूं। – Rarw

उत्तर

7

गतिविधि के संदर्भ का उपयोग करें। उदाहरण:

MyAsyncTask mat = new MyAsyncTask(this); 

MyAsyncTask contructor:

public MyAsyncTask(MyActivity context) { 
    mContext = context; 
} 

MyAsyncTask के भीतर से MyActivity की विधि methodToCall() कॉल करने के लिए:

((MyActivity)mContext).methodToCall(); 

संपादित करें 1: अपने समस्याओं

मैं अनुमान लगा रहा हूँ मीटर यह है:

public class MyActivity extends Activity { 

    Button b; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.some_layout); 

     b = (Button) findViewById(...); 

     b.setOnClickListener(new OnClickListener() {  
      @Override 
      public void onClick(View v) { 
       Button newButton = new Button(this);  // Won't work!! 
      } 
     }); 
    } 
} 

वर्कअराउंड:

  • MyActivity में एक प्रणाली की घोषणा: this के स्थान पर getContext()

    public Context getContext() { 
        return (Context)this; 
    } 
    
    b.setOnClickListener(new OnClickListener() {  
        @Override 
        public void onClick(View v) { 
         Button newButton = new Button(getContext()); // Will work 
        } 
    }); 
    
  • उपयोग MyActivity.this

  • एक और तरीका है कि राज्य के लिए MyActivity इंटरफ़ेस लागू करता है:

    public class MyActivity extends Activity implements View.OnClickListener { 
    
        .... 
        .... 
    
        @Override 
        public void onClick(View v) { 
         Button newButton = Button (this)    // Will Work 
        } 
    } 
    
+0

यदि मेरे पास इंटरफ़ेस का उपयोग करके गतिविधि में कॉलबैक है - तो मैं उस विधि के भीतर क्या उपयोग करूंगा? एक बार जब मैं इंटरफ़ेस विधि को ओवरराइड करता हूं, तो मैं इंटरफ़ेस के माध्यम से गुजरने के बिना एसिंक टास्क संदर्भ को तब तक गतिविधियों का संदर्भ नहीं प्राप्त कर सकता हूं, साथ ही मैं भी कर सकता हूं? – Rarw

+0

@Rarw मुझे आपकी टिप्पणी थोड़ा उलझन में मिलती है।तो, मान लीजिए गतिविधि ए लागू करता है View.OnClickListener। गतिविधि ए फिर 'ऑनक्लिक (देखें)' विधि को परिभाषित करता है। क्या आप पूछ रहे हैं कि क्या आप 'एक्लिक (व्यू)' के अंदर गतिविधि ए के संदर्भ (या इसके तरीकों) का उपयोग कर सकते हैं? यदि यह आपका प्रश्न नहीं था, तो क्या आप इसे समझाने के लिए एक उदाहरण का उपयोग कर सकते हैं? – Vikram

+0

@Rarw आपके संपादन से प्रश्न में, मुझे लगता है कि मुझे पता है कि आप क्या प्राप्त कर रहे हैं। ऊपर 1 संपादित करें देखें। – Vikram

0

यह एक विषय aber "लीक" है। सबसे पहले पारित होने वाली गतिविधि अच्छी नहीं है। कुछ अन्य सुझावों के अनुसार लोगों को getAplication या getAplicationContext प्राप्त करना चाहिए। लेकिन तुम, यानी अपने आवरण के लिए WeakReference उपयोग कर सकते हैं:

static class X { 
    WeakReference<Activity> context; 
    X(Activity context) { 
     this.context = new WeakReference<Activity>(context); 
    } 
} 

अपनी कक्षा चिह्नित करने के लिए स्थिर का उपयोग याद रखें, यह संभावित "इस" अपने होस्ट को गतिविधि से बचने के सकता है।

आप कुछ सुझाव दे दिया है सकते हैं, कुछ भी नहीं :)