In meiner ersten AsyncTask doInBackground
Methode ich eine Methode ausführen, die eine Liste der Orte von Google Place Api erhalten. Innerhalb der postExecute
dieser ersten AsyncTask, bekomme ich alle Namen dieser Orte und zeige sie alle in einem ListView.AsyncTask innerhalb von onPostExecute einer anderen Asynctask und das Ergebnis zurück
Ich möchte jetzt die Fahrdistanz eines einzelnen Ortes von meinem aktuellen Standort zeigen (ich kann es schon bekommen). Um dies zu erreichen, habe ich in einer anderen Klasse eine weitere AsyncTask erstellt. Hier ist der Code:
public class Distance extends AsyncTask<Double, Double, String> {
GooglePlaces googlePlaces;
String distancePlace = null;
@Override
final protected String doInBackground(Double... params) {
double lat1,lat2,lon1,lon2;
lat1=params[0];
lon1=params[1];
lat2=params[2];
lon2=params[3];
googlePlaces = new GooglePlaces();
distancePlace= googlePlaces.getDistance(lat1,lon1,lat2,lon2);
return distancePlace;
}
}
und dies ist der Code meiner ersten AsyncTask postExecute
:
protected void onPostExecute(String s) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//get json status
String status = nearPlaces.status;
if (status.equals("OK")){
if (nearPlaces.results != null){
//every single place
for (Place p : nearPlaces.results){
//just a try, here I would like to get the distance
/*
Double[] myparams = {gps.getLatitude(),gps.getLongitude(),
p.geometry.location.lat,p.geometry.location.lng};
new Distance().execute(myparams);*/
HashMap<String,String> map = new HashMap<String, String>();
map.put(KEY_NAME,p.name);
//add hashmap
placesListItems.add(map);
}
ListAdapter adapter = new SimpleAdapter(GpsActivity.this, placesListItems, R.layout.list_item, new String[] {KEY_REFERENCE,KEY_NAME},
new int[] {R.id.reference, R.id.name});
//add into listview
lv.setAdapter(adapter);
}
Mein Problem ist, wie man den „Abstand AsyncTask“ in meinem PostExecute auszuführen und dessen Ergebnis zurück in mein zuerst AsyncTask, um es in meiner ListView anzuzeigen.
Ich verstehe nicht, wo genau ich Ihren Code, kurz vor dem 'für' setzen muss? Und dann setzen Sie 'onPostExecute (String result2)' den ganzen Rest ('HashMap' etc ..)? – user6262006
@ user6262006 Meine Antwort zeigt, wie Sie eine 'AsyncTask' starten können, wenn eine andere beendet ist und wie Sie auf die Ergebnisse der ersten Aufgabe innerhalb der' onPostExecute (...) 'Methode der zweiten zugreifen können. Ich bin mir nicht sicher, was Sie erreichen wollen, daher kann ich nicht genauer darauf eingehen, wie Sie das nutzen können. – Titus
Wie Sie in dem Code, den ich gepostet habe, sehen können, muss ich für jede Stelle in der Liste von Place 'nearPlaces.result' die' Distance AsyncTask' ausführen, die in einer anderen Klasse ist, nicht in derselben Aktivität, und die Ergebnis der 'Distance AsyncTask' für jeden Ort, damit ich sie zu meiner' HashMap' hinzufügen kann und sie mit dem Namen des jeweiligen Ortes anzeigen kann. Die Methode 'postExecute', die Sie in meinem Code sehen können, stammt von der anderen AsyncTask, die nach Orten sucht. – user6262006