2013-05-28 16 views
8

Wie in der doInBackgroundmehr Werte Pass in doInBackground AsyncTask Android

mehr Werte passieren Mein AsyncTask sieht wie folgt aus.

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

     } 
} 

Ist es möglich, irgendwie mehr Werte weitergeben meiner protected String DoInBackground

zum Beispiel: protected String doInBackground(String... sUrl, String... otherUrl, Context context)

Und wie die AsyncTask nach dem execute? new DownloadFile.execute("","",this) oder etwas?

+1

Sie können die downloadFile-Klasse des Konstruktors argument-ed erstellen und dann diese Argumente überall im Klassenkörper verwenden. –

Antwort

7
String... sUrl 

die drei aufeinander folgende Punkte passieren mehr als einen String bedeutet. Die Punkte sind varargs

Und wie um den Kontext zu übergeben?

Sie es das Hinzufügen eines Konstruktor erzwingen kann, dass der Kontext als Parameter übernimmt:

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

Und wie den Kontext übergeben? – Naskov

11

Sie können mehrere Parameter senden, wie Sie sie als varargs senden können. Aber Sie müssen denselben Parametertyp verwenden. So zu tun, was Sie versuchen Sie eine der folgenden folgen

Option 1

Sie eine Setter-Methode verwenden können, einen gewissen Wert des Klassenmitglied setzen dann die in doInBackGround verwenden. Zum Beispiel

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 
     } 
} 

Option 2

Oder Sie Konstruktor verwenden können die Werte wie

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

Gut gemacht, danke! –

1

Sie Konstruktor

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

Ja, Sie können in in constructor aber nicht mehr Werte übergeben können doInBackground

auf diese Weise

new DownloadFile(String sUrl,String other Url,Context context).execute(); 

Async Aufgabe

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

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

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

    } 

Versuchen}

3

Sie können nicht, aus den folgenden Gründen:

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

ist keine gültige Methodensignatur.Die Punktnotationen (Varargs) können nur als letzter Parameter der Methode verwendet werden. Diese Einschränkung ist, weil sie sonst den Polymorphismus viel komplexer machen würde. In der Tat, wie würde Java wissen, welche Ihrer Strings gehen zu sUrl, und welche geht zu otherUrl?

Außerdem doInBackground überschreibt eine Methode aus AsyncTask. Daher können Sie die Methodensignatur nicht ändern.

Sie können diese Werte jedoch zu Mitgliedern Ihrer Klasse machen und den Konstruktor Ihrer Klasse DownloadFile übergeben oder Setter hinzufügen, um sie vor dem Aufruf von execute festzulegen.

+0

+1 für die nette Erklärung – stinepike

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

dies ist ein Weg, mehr url passieren ... wenn Sie mehr Werte in doinbackground Methode senden wollen ..

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; 
    } 
} 

Sie die Klasse mit

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

Ypu nennen kann Konstruktor erstellen, um verschiedene Typenparameter und auch Zeichenketten-Daten zu übergeben, die String ... 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"); 
verwenden
4

Sie so etwas wie dies in Ihrem doInBackground Methode tun können:

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

AsyncTask auf diese Weise auszuführen:

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

der erste Wert: sUrl [0] wird derjenige von string1 vergangen sein und
surl [1] wird der zweite übergebene Wert sein, dh string2!

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."; 
       } 
      } 
    } 
Verwandte Themen