Ho un'applicazione che esegue alcuni lunghi calcoli e vorrei mostrare una finestra di avanzamento mentre questo è fatto. Finora ho scoperto che avrei potuto farlo con thread/handler, ma non ha funzionato, e poi ho scoperto lo AsyncTask
.Passare argomenti a AsyncTask e restituire i risultati
Nella mia applicazione utilizzo mappe con marcatori e ho implementato la funzione onTap per chiamare un metodo che ho definito. Il metodo crea una finestra di dialogo con i pulsanti Sì/No e vorrei chiamare un AsyncTask
se si fa clic su Sì. La mia domanda è come passare uno allo AsyncTask
(e lavorarci lì), e come ottenere un nuovo ArrayList<String>
come risultato dal AsyncTask
?
Il codice del metodo assomiglia a questo:
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);
Quindi, come vedete, vorrei inviare la stringa lista di array "passaggio" al AsyncTask
, e per ottenere il "risultato" stringa elenco di matrice da esso. E la classe calc_stanica AssycTask
si presenta così:
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();
}
Quindi la mia domanda è come ottenere gli elementi della lista di array "passaggio" nel metodo AsyncTask doInBackground
(e li usa lì), e come restituire una lista di array da usare nel metodo principale (la lista di matrice "risultato")?
Grazie per la risposta, ma ho ancora una cosa da chiedere. Se definisco int min = Integer.parseInt (minim); ad esempio, nella classe AsyncTask suPostExecute(), come posso accedervi dal mio metodo di classe principale? Quando lo cambio in questo modo, ottengo l'errore "min non può essere risolto" nel metodo della classe principale. –
@Bojan Ilievski: basta rendere globale la variabile min. – Wroclai
Grazie per aver risposto di nuovo, ho risolto i miei problemi ... –