0

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.

Antwort

0

Sie können etwas tun:

Distance distance = new Distance(){ 
    protected void onPostExecute(final String result1) { 
     // First AsyncTask result. 
     Distance distance2 = new Distance(){ 
      protected void onPostExecute(String result2) { 
       // process the second result. 
       // Because the first result "result1" is "final", 
       // it can be accessed inside this method. 
      } 
     }; 
     distance2.execute(...); 
    } 
}; 
distance.execute(...); 

Auch brauchen Sie nicht runOnUiThread(...) zu verwenden, da die onPostExecute(...) Methode auf dem UI-Thread ausgeführt wird.

+0

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

+0

@ 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

+0

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