2013-05-28 5 views
8

में अधिक मान पास कैसे doInBackgrounddoInBackground AsyncTask एंड्रॉयड

में अधिक मान पारित करने के लिए मेरे AsyncTask इस तरह दिखता है। बाद AsyncTaskexecute को protected String doInBackground(String... sUrl, String... otherUrl, Context context)

और कैसे:

private class DownloadFile extends AsyncTask<String, Integer, String> { 
     @Override 
     protected String doInBackground(String... sUrl) { 
     { 

     } 
} 

यह मेरी protected String DoInBackground

उदाहरण के लिए

के बारे में अधिक मान पास करने के किसी भी तरह संभव है? new DownloadFile.execute("","",this) या कुछ?

+1

आप तर्क-एडी कन्स्ट्रक्टर डाउनलोडफाइल क्लास बना सकते हैं और फिर क्लास बॉडी में कहीं भी उन तर्कों का उपयोग कर सकते हैं। –

उत्तर

7
String... sUrl 

लगातार तीन एक से अधिक स्ट्रिंग अर्थ डॉट्स की तरह मान पास करने के लिए कर सकते हैं। डॉट varargs

और संदर्भ कैसे पास करें?

आप इसे एक निर्माता है कि पैरामीटर के रूप में संदर्भ लेता जोड़ने के लिए मजबूर कर सकते हैं: निर्माता

private Context mContext; 
public void setContext(Context context){ 
    if (context == null) { 
     throw new IllegalArgumentException("Context can't be null"); 
    } 
    mContext = context; 
} 
+1

और संदर्भ कैसे पास करें? अच्छी व्याख्या के लिए – Naskov

11

आप कई पैरामीटर भेज सकते हैं क्योंकि आप उन्हें varargs के रूप में भेज सकते हैं। लेकिन आपको उसी प्रकार के पैरामीटर का उपयोग करना होगा। तो क्या आप अपने अनुयायीयों

विकल्प 1

आप एक सेटर विधि का उपयोग कर सकते वर्ग के सदस्य के कुछ मूल्य स्थापित करने के लिए तो doInBackGround में उन का उपयोग के किसी भी पालन कर सकते हैं कोशिश कर रहे हैं करने के लिए। उदाहरण

private class DownloadFile extends AsyncTask<String, Integer, String> { 
     private Context context; 
     public void setContext(Context c){ 
      context = c; 
     } 
     @Override 
     protected String doInBackground(String... sUrl) { 
     { 
       // use context here 
     } 
} 

विकल्प 2

या आप निर्माता का उपयोग

private class DownloadFile extends AsyncTask<String, Integer, String> { 
     private Context context; 
     public DownloadFile (Context c){ 
      context = c; 
     } 
     @Override 
     protected String doInBackground(String... sUrl) { 
     { 
       // use context here 
     } 
} 
+0

ठीक है, धन्यवाद! –

1

आप उपयोग कर सकते

private class DownloadFile extends AsyncTask<String, Integer, String> { 
      private Context context; 
      public void DownloadFile(Context c,String one, int two){ 
       context = c; 
      } 
      @Override 
      protected String doInBackground(String... sUrl) { 
      { 
        // use context here 
      } 
    } 
3

हाँ आप में constructor में अधिक मान पास लेकिन नहीं कर सकते doInBackground

इस तरह

new DownloadFile(String sUrl,String other Url,Context context).execute(); 
प्रयास करें

Async कार्य

private class DownloadFile extends AsyncTask<String, Integer, String> { 

    public DownloadFile(String url,String url2,Context ctx) 
    { 

    } 
    @Override 
    protected String doInBackground(String... sUrl) { 
    { 

    } 

}

3

आप नहीं कर सकते हैं निम्नलिखित कारणों के लिए:

protected String doInBackground(String... sUrl, String... otherUrl, Context context) 

मान्य विधि हस्ताक्षर नहीं है।डॉट्स नोटेशन (वरर्ग) का उपयोग केवल विधि के अंतिम पैरामीटर के रूप में किया जा सकता है। यह प्रतिबंध इसलिए है क्योंकि अन्यथा यह बहुरूपता को और अधिक जटिल बना देगा। वास्तव में, जावा कैसे जानेंगे कि आपकी कौन सी स्ट्रिंग sUrl पर जाती है, और जो otherUrl पर जाती है?

इसके अलावा, doInBackgroundAsyncTask से एक विधि को ओवरराइड करता है। इस प्रकार, आप विधि हस्ताक्षर नहीं बदल सकते हैं।

हालांकि, आप क्या कर सकते हैं, जो आपके वर्ग के उन मूल्य सदस्यों को बनाते हैं और DownloadFile कक्षा के निर्माता में पास करते हैं या execute पर कॉल करने से पहले सेट करने के लिए सेटर्स जोड़ते हैं।

+0

+1 – stinepike

1
new DownloadFile().execute(Str1,str2,str3,........); 

यह एक तरह से अधिक यूआरएल ... यदि आप doinbackground विधि में अधिक मान भेज चाहते पारित करने के लिए ..

public class DownloadFile extends AsyncTask<DataHolders, Integer, String> { 
    public class DataHolders { 
     public String url; 
     public String myval; 
    } 
    @Override 
    protected String doInBackground(DataHolders... params) { 

     return null; 
    } 
} 

आप के साथ

DataHolders mhold = new DataHolders(); 
new DownloadFile().execute(mhold,mhold2,mhold3,........); 
1

ypu वर्ग कॉल कर सकते हैं है विभिन्न प्रकार के पैरामीटर पास करने के लिए कन्स्ट्रक्टर बना सकते हैं और स्ट्रिंग का उपयोग कर डेटा स्ट्रिंग भी कर सकते हैं ...... str

private class DownloadTask extends AsyncTask<String, Integer, String> { 
     private Context context; 
      byte[] byteArray; 
     public DownloadTask (Context c,byte[] byteArray){ 
      context = c; 
      byteArray=byteArray; 
     } 
     @Override 
     protected String doInBackground(String... str) { 
     { 
       // use context here 
    System.out.println(param[0]); 
      } 
    } 



new DownloadTask(context,bytearray).excute("xyz"); 
4

आप अपने doInBackground विधि के अंदर कुछ इस तरह कर सकते हैं:

String a = sUrl[0] 
String b = sUrl[1] 

इस तरह से AsyncTask निष्पादित करें:

new DownloadFile().execute(string1,string2); 

पहले मूल्य: SURL [0] एक string1 से पारित हो जाएगा और
surl [1] दूसरा मान पास होगा अर्थात स्ट्रिंग 2!

0
new DownloadFile().execute("my url","other parameter or url");  
private class DownloadFile extends AsyncTask<String, Integer, String> { 
      @Override 
      protected String doInBackground(String... sUrl) { 
      { 
       try { 
        return downloadContent(sUrl[0], sUrl[1]); // call 
       } catch (IOException e) { 
        return "Unable to retrieve data. URL may be invalid."; 
       } 
      } 
    } 
संबंधित मुद्दे