2012-05-26 16 views
17

मैं बस AsyncTask के बारे में सीख रहा हूं और इसे एक अलग वर्ग के रूप में उपयोग करना चाहता हूं, बल्कि एक सबक्लास।एंड्रॉइड, क्या मैं AsyncTask को एक अलग वर्ग में रख सकता हूं और कॉलबैक कर सकता हूं?

उदाहरण के लिए,

class inetloader extends AsyncTask<String, Void, String> { 


    @Override 
    protected String doInBackground(String... urls) { 

     String response = ""; 

      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(urls[0]); 
      try { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 

       BufferedReader buffer = new BufferedReader(
         new InputStreamReader(content)); 
       String s = ""; 
       while ((s = buffer.readLine()) != null) { 
        response += s; 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     return response; 
    } 


    @Override 
    protected void onPostExecute(String result) { 
     Log.e("xx",result); 
     // how do I pass this result back to the thread, that created me? 
    } 


} 

और मुख्य (यूआई) धागा:

inetloader il = new inetloader(); 
il.execute("http://www.google.com"); 
//il.onResult() 
//{ 
    ///do something... 
//} 

धन्यवाद!

+1

हां आप इसे एक अलग वर्ग में डाल सकते हैं, लेकिन ज्यादातर लोग ऐसा नहीं करते क्योंकि इसकी purpo यदि यह एक आंतरिक वर्ग है तो आमतौर पर बहुत अधिक स्पष्ट होता है। यदि आप इसे कई गतिविधियों में पुन: उपयोग करने जा रहे हैं, तो आगे बढ़ें। – keyser

+0

मैं इसे विभिन्न प्रयोजनों के लिए उपयोग करने की योजना बना रहा हूं, जैसे कि मैं इसे यहां से कॉल करता हूं, नतीजतन इसे ऐसा करना चाहिए और यदि मैं इसे वहां से बुलाता हूं, तो परिणामस्वरूप इसे कुछ और करना चाहिए ... अगर मैं इसे रखूंगा उसी कक्षा में और इसे परिणामस्वरूप उस वर्ग से एक फ़ंक्शन कॉल किया गया है, मुझे हर तरह की कार्रवाई के लिए एक नया AsyncTask बनाना होगा जिसे इसे ऑनर्सल्ट करना है ... –

+0

इंटरफ़ेस का उपयोग करें, बस इंटरफ़ेस द्वारा अपनी गतिविधि को लागू करें और Asyn क्लास कॉल पर postExcute() में mContext.implementedMethod() कॉल करें। –

उत्तर

32

एक इंटरफ़ेस का उपयोग करें। कुछ की तरह:

interface CallBackListener{ 
    public void callback(); 
} 

फिर अपने यूआई धागा में इस करते हैं:

inetloader il = new inetloader(); 
li.setListener(this); 
il.execute("http://www.google.com"); 

inetloader में, जोड़ें:

CallBackListener mListener; 

    public void setListener(CallBackListener listener){ 
    mListener = listener; 
    } 
postExecute() में

तो, कार्य करें:

mListener.callback(); 
+0

धन्यवाद, ध्वनि की तरह यह सही दिशा है। विशेष रूप से अगर मैं inetloader il = new inetloader() के साथ एक कॉलबैकलिस्टर बना सकता हूं; और इसे आईएल ऑब्जेक्ट में पास करें। –

+0

हम्म ... अजीब, मेरे पास एंड्रॉइड v3 में "CallBackListener" नहीं है, हो सकता है कि यह किसी अन्य नाम से हो? –

+3

@RogerTravis हाँ आपको स्वयं को CallBackListener इंटरफ़ेस बनाना है।और अपने मुख्य यूआई कक्षा के लिए "कॉलबैकलिंटर लागू करें" को जोड़ना न भूलें। –

1
inetloader il = new inetloader(); 
il.execute("http://www.google.com"); 

String result = il.get();//put it in try-catch 
       ^^^^^^^^ 

here you get result which is in onPostExecute(String result)

+0

वास्तव में नहीं :(मुझे किसी प्रकार की ऑनसेट श्रोता की आवश्यकता है, जो AsyncTask समाप्त होने के बाद ट्रिगर करेगा, क्योंकि कुछ सर्वरों से पूछताछ में कुछ समय लग सकता है। दूसरी तरफ, il.get() को थोड़ी देर (सत्य) लूप में डालना बहुत आदिम लग सकता है, है ना? :) क्या कोई बेहतर विकल्प हैं? –

+2

@ सैमिर: यह वास्तव में एक बुरा विचार है। जबकि यह 'AsyncTask' से परिणाम पुनर्प्राप्त करने की अनुमति देता है, 'get()' विधि का उपयोग करके यूआई थ्रेड को अवरुद्ध कर देगा और प्रभावी ढंग से एक सिंक्रोनस में एक असीमित प्रक्रिया होनी चाहिए। 'Get() 'विधि के लिए एकमात्र वैध उपयोग मैंने कभी भी' चेनिंग 'के लिए दो' AsyncTasks 'के लिए किया होगा। – Squonk

3

आप निर्माता और वहाँ से गतिविधि समारोह कॉल करने के लिए ...
आसान इंटरफ़ेस की तरह गतिविधि उदाहरण पारित कर सकते हैं:

public interface ResultUpdatable { 

    public void setResult(Object obj); 
    } 

गतिविधि में यह लागू और में पारित Async कार्य का निर्माता और setResult फ़ंक्शन का उपयोग करके onPostExecute से परिणाम अपडेट करें।

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

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