2013-01-10 9 views
37

verwenden Ich möchte keine Argumente an doInBackground Methode der AsyncTask übergeben.Wie AsyncTask korrekt in Android

Also wie sollte der Code sein?

+2

was Sie versucht haben? –

+0

versuchen Sie etwas, bevor Sie etwas veröffentlichen ... lesen Sie Blogs und Entwickler Guide – NullPointerException

Antwort

78
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 

public class AsyncExample extends Activity{ 


private String url="http://www.google.co.in"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 


@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 

    new AsyncCaller().execute(); 

} 

private class AsyncCaller extends AsyncTask<Void, Void, Void> 
{ 
    ProgressDialog pdLoading = new ProgressDialog(AsyncExample.this); 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     //this method will be running on UI thread 
     pdLoading.setMessage("\tLoading..."); 
     pdLoading.show(); 
    } 
    @Override 
    protected Void doInBackground(Void... params) { 

     //this method will be running on background thread so don't update UI frome here 
     //do your long running http tasks here,you dont want to pass argument and u can access the parent class' variable url over here 


     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 

     //this method will be running on UI thread 

     pdLoading.dismiss(); 
    } 

    } 
} 
+0

Danke! Das sieht aus wie ich wollte ...: D – omerjerk

+0

Ich bin froh zu helfen :-) –

+0

Der WAHLE Unterschied zwischen Mehul Ranpara und Mehul Joisar hier ist der Joisar will Hilfe, ohne Fragen zu stellen, aber Ranpara will alle anderen ärgern, die aussehen bei diesem Post ....Deshalb grüße ich Mehul Joisar dafür, freundlich mit der Antwort auf die Frage unabhängig vom Staat zu sein ... – Vincy

6

Warum wollen Sie keine Argumente weitergeben? Sie sollten erklären ...

Dies ist, wie es funktioniert in der Regel (Beispiel):

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 

Und es Sie Anruf ausführen:

new DownloadFilesTask().execute(url1, url2, url3); 

Quelle: Android docs

+0

Oft Parameter an AsyncTask übergeben werden, aber nicht notwendig – codeMagic

+0

gibt es keine Notwendigkeit für mich, ein Argument zu übergeben "doInBakground". Diese Methode öffnet nur eine PHP-Datei auf meinem Webserver per POST-Methode. Und ich brauche nur eine Antwort von dieser PHP-Datei zu bekommen. Also muss ich keine Argumente an 'doInBackground' übergeben. – omerjerk

+0

Einfach - Sie verwenden nur die 'Void' Klasse. Sie hätten also 'private class DownloadFilesTask erweitert AsyncTask {'. –

6

Erstellen Sie Ihre AsyncTask Klasse, als ob Sie keinen Parameter an doInBackground übergeben möchten:

public class LongOperation extends AsyncTask<Void, Void, String> { 


      public LongOperation(Context context) { 

      } 

      @Override 
      protected void onPreExecute() { 

      } 

      @Override 
      protected String doInBackground(Void... params) { 

       return null; 
      }  

      @Override 
      protected void onPostExecute(String result) {       

      } 
    } 

und starten AsyncTask als ohne Parameter vorbei auszuführen:

LongOperation longOperation = new LongOperation(this); 
    longOperation.execute(); 
+0

Mir ist aufgefallen, dass die Android Studio-Autocomplete nicht die Fehlermeldung "" enthält, die Sie stolpern kann. Beachten Sie auch, dass die Rückgabe für 'doInBackground' tatsächlich das dritte Argument der Klasse sein muss (" String "im gezeigten Beispiel). – Fattie

12

Nach AsyncTask, seine

AsyncTask<Params, Progress, Result> 
  • Param, die Art der Parameter, die gesendete Aufgabe bei der Ausführung.
  • Progress, der Typ der Fortschrittseinheiten, die während der Hintergrundberechnung veröffentlicht wurden.
  • Ergebnis, der Typ des Ergebnisses der Hintergrundberechnung.

Also, wenn Sie Lücke in doInBackground passieren wollen nur Leere anstelle von Params übergeben.

Beispielcode:

class DownloadLink extends AsyncTask<Void, Void, Void> { 


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

      //Do Your stuff here.. 
      return null; 
     } 
    } 

Und nennen Sie es wie:

new DownloadLink().execute(); 
+0

Es bedeutet, dass params das Array von Aufgaben ist und der Rückgabetyp für alle Aufgaben leer ist – blackHawk

+0

@blackHawk - Yes –