AsyncTask里面的另一个Asynctask的onPostExecute并返回结果

时间:2016-04-27 14:41:44

标签: java android listview android-asynctask google-places-api

在我的第一个AsyncTask doInBackground方法中,我运行了一个从Google Place Api获取地点列表的方法。在第一个AsyncTask的postExecute内,我得到了这些地方的所有名称,并在ListView中显示它们。

我现在想要显示一个地方距离我当前位置的行车距离(我已经可以得到它)。为此,我在另一个类中创建了另一个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);
                    }

我的问题是如何执行&#34;距离AsyncTask&#34;在我的postExecute中,将其结果返回到我的第一个AsyncTask中,以便在我的ListView中显示它。

1 个答案:

答案 0 :(得分: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(...);

此外,您不需要使用runOnUiThread(...),因为在{i}方法上执行onPostExecute(...)方法。