2012-01-25 13 views
5

उपclassing मैं सामान्य रूप से android.os.AsyncTask कक्षा subclass करने की कोशिश कर रहा हूँ। मैं मूल रूप से बस इसमें एक संपत्ति जोड़ना चाहता हूँ। बात यह है कि, मैं अभी भी इसे अज्ञात वर्ग के रूप में उपयोग करने में सक्षम होना चाहता हूं।जावा: AsclcTask

import android.content.Context; 
    import android.os.AsyncTask; 

    public class KAsyncTask extends AsyncTask<Params, Progress, Result> { 
     public Context c; 

    } 

मैंने इसे सबक्लासिंग करने का प्रयास किया है, लेकिन मैं इसे अपने सिर के चारों ओर लपेट नहीं सकता हूं कि मुझे यह कैसे करना है।

सादर, EZFrag

+0

आप इस उदाहरण को देखो करना चाहते हो सकता है http://www.etosis.com/posts/asynctask-helpers –

उत्तर

16

आप क्या आपका मतलब अभी भी यह AsyncTask की तरह एक अमूर्त टेम्पलेट वर्ग बनना चाहते हो? घोषणा होगा:

public abstract class KAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> { 
    public Context c; 

} 
+0

धन्यवाद रूबेन, कि काम किया। मैं कल आपका उत्तर स्वीकार करूंगा ... मैं जो करना चाहता हूं उसे साझा करना चाहता हूं। – EZFrag

2

अगर मैं आपके सवाल का सही ढंग से समझ, आप एक तरह से दृष्टांत के लिए देख रहे हैं एक गुमनाम भीतरी AsyncTask जो भी एक उदाहरण चर है। आप AsyncTask पर उस अतिरिक्त मूल्य को पारित करने की योजना कैसे बनाते हैं?

AFAIK, जावा आपको अज्ञात आंतरिक कक्षा के निर्माता को ओवरराइड करने की अनुमति नहीं देता है। तो Params प्रकार (जो एक वर्गास होता है) के हिस्से के रूप में Context में आपकी एकमात्र आशा है। इसका मतलब है कि आपको ParamsContext के रूप में टाइप करना होगा; या String के रूप में String और serialize/Parcel अपने Context का उपयोग करें। मैं ईमानदारी से महसूस करता हूं कि यह प्रयास के लायक नहीं है और एक हैक का बहुत अधिक है।

क्या कोई कारण है कि आप अज्ञातAsyncTask का उपयोग करना चाहते हैं? मैं सुझाव दूंगा कि आप AsyncTask का नामित कार्यान्वयन बनाएं।

+0

+1, समस्या आईएमओ के बारे में सोचने का यह सही तरीका है। – Guillaume

6

धन्यवाद रूबेन, यह 100% अपेक्षित काम करता है।

यहाँ मैं अब है:

import android.content.Context; 
    import android.os.AsyncTask; 

    public abstract class KAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> { 
     public Context context; 

     public KAsyncTask<Params, Progress, Result> setContext(Context c){ 
      this.context = c; 
      return this; 
     } 
    } 

और यह मैं इसे कैसे उपयोग करते हैं:

new KAsyncTask<Void, Void, Void>() { 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      Toast.makeText(context, "Connecting to Server...", Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      //super.onPostExecute(result); 
      Toast.makeText(context, "Responce Recieved.", Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 

      //Do webservice calls in here 

      return null; 
     } 

    }.setContext(this).execute(); 

मैं काम से ही उपयोगकर्ता को संदेश प्रदर्शित करने के लिए संदर्भ की जरूरत है।

सादर, EZFrag

+1

आप अपने अज्ञात AsynkTask से subclassing के बिना yourActivityName.this भी इस्तेमाल कर सकते थे। –