118 votes

Android: Comment puis-je passer des paramètres à AsyncTask est onPreExecute()?

J'utilise un AsyncTask pour les opérations de chargement que j'ai mis en place comme un intérieur de classe. Dans onPreExecute() je montre un dialogue de chargement que j'ai ensuite se cacher à nouveau dans onPostExecute(). Mais pour certains, les opérations de chargement, je sais à l'avance qu'ils terminent très rapidement, de sorte que je ne veux pas afficher le dialogue de chargement. Je voulais l'indiquer par un paramètre booléen qui j'ai pu passer à onPreExecute() mais apparemment pour une raison quelconque onPreExecute() ne prend aucun paramètre. La solution évidente serait probablement pour créer un champ de membre dans mon AsyncTask ou à l'extérieur de la classe qui je dois régler avant chaque opération de chargement, mais qui ne semble pas très élégant. Est-il une meilleure façon de le faire?

235voto

Felix Points 33944

Vous pouvez surcharger le constructeur. Quelque chose comme:

private class MyAsyncTask extends AsyncTask<Void, Void, Void> {

    public MyAsyncTask(boolean showLoading) {
        super();
        // do stuff
    }

    // doInBackground() et al.
}

Ensuite, lors de l'appel de la tâche, de faire quelque chose comme:

new MyAsyncTask(true).execute(maybe_other_params);

Edit: c'est plus utile que de créer des variables de membre, car elle simplifie la tâche de l'invocation. Comparer le code ci-dessus avec:

MyAsyncTask task = new MyAsyncTask();
task.showLoading = false;
task.execute();

63voto

karl Points 69

1) Pour moi, c'est le moyen le plus simple passage de paramètres à async task c'est comme cela

// To call the async task do it like this
Boolean[] myTaskParams = { true, true, true };
myAsyncTask = new myAsyncTask ().execute(myTaskParams);

Déclarer et utiliser le async tâche de cette

private class myAsyncTask extends AsyncTask<Boolean, Void, Void> {

    @Override
    protected Void doInBackground(Boolean...pParams) 
    {
        Boolean param1, param2, param3;

        //

          param1=pParams[0];    
          param2=pParams[1];
          param3=pParams[2];    
      ....
}                           

2) les méthodes de transmission de async-tâche Afin d'éviter de coder l'async-Tâche de l'infrastructure (thread, messagenhandler, ...) de multiples fois, vous pourriez envisager de passer les méthodes qui devraient être exécutées dans async-tâche en tant que paramètre. Exemple suivant illustre cette approche. En outre, vous pourriez avoir besoin de sous-classe async-tâche pour passer des paramètres d'initialisation dans le constructeur.

 /* Generic Async Task    */
interface MyGenericMethod {
    int execute(String param);
}

protected class testtask extends AsyncTask<MyGenericMethod, Void, Void>
{
    public String mParam;                           // member variable to parameterize the function
    @Override
    protected Void doInBackground(MyGenericMethod... params) {
        //  do something here
        params[0].execute("Myparameter");
        return null;
    }       
}

// to start the asynctask do something like that
public void startAsyncTask()
{
    // 
    AsyncTask<MyGenericMethod, Void, Void>  mytest = new testtask().execute(new MyGenericMethod() {
        public int execute(String param) {
            //body
            return 1;
        }
    });     
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X