web-dev-qa-db-fra.com

Comment utiliser AsyncTask correctement dans Android

Je ne veux pas passer d'arguments à la méthode doInBackground de la AsyncTask.

Alors, à quoi devrait ressembler le code?

42
omerjerk
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();
    }

    }
}
95
Mehul Joisar

Selon AsyncTask , ses

 AsyncTask<Params, Progress, Result>
  • Params, le type des paramètres envoyés à la tâche lors de son exécution.
  • Progress, le type des unités de progression publiées lors du calcul en arrière-plan.
  • Résultat, le type du résultat du calcul en arrière-plan.

Donc, si vous voulez que void soit doInBackground , passez void à la place de Params.

Exemple de code:

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


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

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

Et appelez ça comme:

 new DownloadLink().execute();
17
Name is Nilay

Créez votre classe AsyncTask comme si vous ne vouliez transmettre aucun paramètre à doInBackground:

 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) {                           

          }
    }

et démarrez AsyncTask as sans passer aucun paramètre à exécuter:

   LongOperation longOperation = new LongOperation(this);
   longOperation.execute();
9
ρяσѕρєя K

Pourquoi ne veux-tu pas lui passer des arguments? Tu devrais expliquer ...

Voici comment cela fonctionne habituellement (exemple):

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

Et pour l'exécuter, vous appelez:

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

Source: documents Android

8
Oleg Vaskevich