Passage d'arguments à AsyncTask, et le retour des résultats
J'ai une application qui fait de longs calculs, et je voudrais afficher une boîte de dialogue de progression alors que cela est fait. Pour l'instant j'ai trouvé que je pouvais le faire avec threads/gestionnaires, mais n'a pas fonctionné, puis j'ai découvert le AsyncTask
.
Dans mon application j'utilise des cartes avec des marqueurs sur elle, et j'ai mis en œuvre la onTap la fonction à appeler une méthode que j'ai défini. La méthode crée une boîte de dialogue Oui/Non les boutons, et je voudrais appeler un AsyncTask
si Oui est cliqué. Ma question est de savoir comment passer un ArrayList<String>
à la AsyncTask
(et de travailler avec elle là-bas), et comment l'obtenir en retour une nouvelle ArrayList<String>
comme un résultat de la AsyncTask
?
Le code de la méthode ressemble à ceci:
String curloc = current.toString();
String itemdesc = item.mDescription;
ArrayList<String> passing = new ArrayList<String>();
passing.add(itemdesc);
passing.add(curloc);
ArrayList<String> result = new ArrayList<String>();
new calc_stanica().execute(passing,result);
String minim = result.get(0);
int min = Integer.parseInt(minim);
String glons = result.get(1);
String glats = result.get(2);
double glon = Double.parseDouble(glons);
double glat = Double.parseDouble(glats);
GeoPoint g = new GeoPoint(glon, glat);
String korisni_linii = result.get(3);
Donc, comme vous le voyez, je voudrais vous envoyer le tableau de chaîne de la liste de "passer" à la AsyncTask
, et pour obtenir le "résultat" de la chaîne de la liste des ensembles de recul. Et le calc_stanica AssycTask
classe ressemble à ceci:
public class calc_stanica extends AsyncTask<ArrayList<String>, Void, ArrayList<String>> {
ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(baraj_mapa.this);
dialog.setTitle("Calculating...");
dialog.setMessage("Please wait...");
dialog.setIndeterminate(true);
dialog.show();
}
protected ArrayList<String> doInBackground(ArrayList<String>... passing) {
//Some calculations...
return something; //???
}
protected void onPostExecute(Void unused) {
dialog.dismiss();
}
Donc ma question est de savoir comment obtenir les éléments de la "passant" liste de tableau dans la AsyncTask doInBackground
méthode (et de les utiliser là-bas), et comment retourner une liste de tableau à utiliser dans la méthode main (le "résultat" tableau liste)?
Vous devez vous connecter pour publier un commentaire.
Changer votre méthode pour ressembler à ceci:
Et de changer votre async mise en œuvre opérationnelle de
UPD:
Si vous souhaitez avoir accès à la tâche contexte de départ, le plus simple serait de remplacer onPostExecute en place:
ArrayList
surAsyncTask.execute
: Type de sécurité: Un générique gamme de ArrayList<String> est créée pour une varargs paramètre.result
revient à la méthode main. Je n'ai tout simplement pas l'obtenir. Pourriez-vous expliquer?doInBackground
, dans votre exemple, le premier bloc de code, plus précisément la lignenew calc_stanica().execute(passing);
. Si vous passez dans les données, par l'intermédiairepassing
; comment voulez-vous récupérer des données? Si je voulais obtenir un résultat, il semble que j'aurais de le stocker dans un champ (ou une sorte de variable globale si la méthode est statique)... est-ce que le droit?Pourquoi voudriez-vous passer un ArrayList??
Il devrait être possible de simplement appeler exécuter avec les paramètres directement:
Que comment varrargs de travail, droit?
Faire une liste de tableaux pour passer la variable est le double de travail.
J'ai en quelque sorte d'accord avec leander sur celui-ci.
appel:
tâche:
Ou vous pourriez juste faire la liste des résultats d'une classe de paramètre et de remplacer la liste de tableaux avec un booléen (succès/échec);
Je n'ai pas le faire comme cela. Je trouve plus facile de surcharger le constructeur de la asychtask classe ..
public class calc_stanica extends AsyncTask>
Vous pouvez recevoir le renvoi de résultats comme ça:
AsyncTask
classela réception de classe:
En espérant que cela en aide.