2016-04-27 95 views
0

在我第一次的AsyncTask doInBackground方法我運行得到的來自谷歌廣場API會將列表的方法。在第一個AsyncTask的postExecute裏面,我得到了這些地方的所有名字,並將它們全部顯示在一個ListView中。的AsyncTask內的另一個的AsyncTask的onPostExecute並返回結果

我現在想顯示從我的當前位置在一個地方的行進距離(我已經可以得到它)。爲此,我在另一個類中創建了另一個AsyncTask來獲得這個距離。下面是代碼:

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; 
    } 
} 

,這是我第一次的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); 
        } 

我的問題是如何執行的「距離的AsyncTask」我postExecute內,其結果返回到我第一個AsyncTask,在我的ListView中顯示它。

回答

0

你可以做這樣的事情:

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(...); 

而且,你不需要因爲onPostExecute(...)方法是在UI線程上執行使用runOnUiThread(...)

+0

我不完全是我必須把你的代碼中,只是'for'之前,明白了嗎?然後把'onPostExecute(String result2)'放在裏面(''HashMap'等..)? – user6262006

+0

@ user6262006我的回答說明瞭如何啓動一個'AsyncTask'當一個又一個結束,你如何訪問'onPostExecute(...)'第二個方法裏面的第一個任務的結果。我不確定你想要達到什麼,所以我不能更具體地說明你如何使用它。 – Titus

+0

正如你在我張貼的代碼中看到,對於每一個位置,在適當nearPlaces.result'的'名單,我需要執行'距離AsyncTask',這是另一個類,而不是在相同的活動,並獲得每個地方都有'Distance AsyncTask'的結果,所以我可以將它添加到我的'HashMap'中,並用相應位置的名稱顯示它。您可以在我的代碼中看到的'postExecute'方法來自另一個AsyncTask,它搜索位置。 – user6262006

相關問題