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
}
}
É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
}
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);
}
Un moyen simple consiste à ajouter un constructeur:
public Setup(String a, Int b) {
this.a = a;
this.b = b;
}
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