我读过类似的主题,但没有得到明确的答案。 我的应用程序使用AsyncTask in循环来计算城市之间的距离。因此,我的应用程序多次与Google Maps API进行通信。问题是变量" i" of循环在结果返回之前取最终值。如何确保在第一个AsyncTask返回结果之后执行第二个AsyncTask;
部分代码......
for(n=0;n<b-1;n++){
if(!itinList1.get(n+1).get("username").equals(username)){
if(itinList1.get(n).get("username").equals(username)){
origin_lat = itinList1.get(n).get("start_lat_pro").toString();
origin_lng = itinList1.get(n).get("start_lng_pro").toString();
destination_lat = itinList1.get(n).get("final_lat_pro").toString();
destination_lng = itinList1.get(n).get("final_lng_pro").toString();
for (w = n; w < b; w++) {
markerPoints = new ArrayList<LatLng>();
waypoint1_lat = itinList1.get(w).get("start_lat_pro").toString();
waypoint1_lng = itinList1.get(w).get("start_lng_pro").toString();
waypoint2_lat = itinList1.get(w).get("final_lat_pro").toString();
waypoint2_lng = itinList1.get(w).get("final_lng_pro").toString();
LatLng origin1 = new LatLng(Double.parseDouble(origin_lat),
Double.parseDouble(origin_lng));
LatLng destination = new LatLng(
Double.parseDouble(destination_lat),
Double.parseDouble(destination_lng));
LatLng waypoint1 = new LatLng(
Double.parseDouble(waypoint1_lat),
Double.parseDouble(waypoint1_lng));
LatLng waypoint2 = new LatLng(
Double.parseDouble(waypoint2_lat),
Double.parseDouble(waypoint2_lng));
markerPoints.add(origin1);
markerPoints.add(destination);
markerPoints.add(waypoint1);
markerPoints.add(waypoint2);
LatLng or = markerPoints.get(0);
LatLng dest = markerPoints.get(1);
// Getting URL to the Google Directions API
String url = getDirectionsUrl(or, dest);
DownloadTask downloadTask = new DownloadTask();
downloadTask.execute(url);
if(itinList1.get(w+1).get("username").equals(username)){
break;
}
}
}
} else {
itinList1.get(n).put("diff", String.valueOf(0));
}
}
我知道嵌套AsyncTask不是一个好主意,但现在很难改变它
答案 0 :(得分:1)
阅读java中的Callback
机制。
1)实现一个接口,例如
interface OnAsyncOneComplete {
void onProcessFinish();
}
2)在您的AsyncTask
onPostExecute()
中,在reference.onProcessFinish();
调用AsyncTask
3)在您呼叫的任何一个班级中,拨打onProcessFinish()
中的其他OnAsyncOneComplete
,实施{{1}}
答案 1 :(得分:0)
您应该执行以下操作:有关详细信息,请参阅here
在第一个asyncTask的onPostExecute()方法中写入第二个asysncTask的调用
是AsyncTask的方法,在doInBackground()完成其工作时执行