web-dev-qa-db-fra.com

Passage de paramètres à Asynctask

J'utilise des tâches asynchrones pour extraire de la chaîne de caractères l'activité du menu et charger des choses..mais je ne suis pas capable de le faire .. Je l'utilise de la bonne façon et je passe correctement les paramètres? Veuillez consulter l'extrait de code. Merci

  private class Setup extends AsyncTask<Void, Integer, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        try {
            if (!(getIntent().getExtras().isEmpty())) {
                Bundle gotid = getIntent().getExtras();
                identifier = gotid.getString("key");
            }
        } catch (Exception e) {
            e.getStackTrace();
        } finally {

            if (identifier.matches("abc")) {
                publishProgress(0);
                db.insert_fri();
            } else if ((identifier.matches("xyz"))) {
                publishProgress(1);
                db.insert_met();
            }
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... i) {
        // start the song here
        if (i[0] == 0) {
            song.setLooping(true);
            song.start();
        }
    }

    @Override
    protected void onPostExecute(Void res) {

    }

    @Override
    protected void onPreExecute() {
        // do something before execution
    }
}
17
Nikhil

Évitez d'ajouter un constructeur. 

Passez simplement vos paramètres dans la méthode execute de la tâche

new BackgroundTask().execute(a, b, c); // can have any number of params

Maintenant, votre classe d'arrière-plan devrait ressembler à ceci

public class BackgroundTask extends AsyncTask<String, Integer, Long> {

    @Override
    protected Long doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        String a = arg0[0];
        String b = arg0[1];
        String c = arg0[2];
        //Do the heavy task with a,b,c
        return null;
    }
    //you can keep other methods as well postExecute , preExecute, etc

}
26
HimalayanCoder

Au lieu de cela je ferais

 private class Setup extends AsyncTask<String, Integer, Void> {

    @Override
    protected Void doInBackground(String... params) {
    String identifier = params[0];

          if (identifier.matches("abc")) {
                publishProgress(0);
                db.insert_fri();
            } else if ((identifier.matches("xyz"))) {
                publishProgress(1);
                db.insert_met();
            }
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... i) {
        // start the song here
        if (i[0] == 0) {
            song.setLooping(true);
            song.start();
        }
    }

    @Override
    protected void onPostExecute(Void res) {

    }

    @Override
    protected void onPreExecute() {
        // do something before execution
    }
}

et vérifiez "identificateur" avant d'appeler l'asynctask pour éviter la surcharge de créer un AsyncTask

comme ça

if (!(getIntent().getExtras().isEmpty())) {
                Bundle gotid = getIntent().getExtras();
                identifier = gotid.getString("key");
               new Setup().execute(identifier);
    }
15
Anuj Tenani

Un moyen simple consiste à ajouter un constructeur:

public Setup(String a, Int b) {
    this.a = a;
    this.b = b;
}
4
Joru

AsyncTask signifie que doInBackground () retourne Void, onProgressUpdate () prend les paramètres Integer et doInbackground prend ... les paramètres String!

Donc, vous n'avez pas besoin (et vous ne devriez VRAIMENT pas) utiliser Intent, car il est destiné à être utilisé pour passer des arguments à travers des activités, pas des threads.

Et comme dit précédemment, vous pouvez créer un constructeur et un paramètre global pour votre classe appelé "identifiant"

public class Setup...
{
    private String identifier;

    public Setup(String a) {
    identifier = a;
    }
}

Espéré que cela pourrait aider . Cordialement

0
Nabil Gardon