我正在开展一个快速响应非常重要的项目,基本上它的作用是获取用户的当前位置,获得一堆本地存储的LatLng对象(最多可能是几个hundrends)并请求谷歌web api for directions。
我的问题是 - 这样做的正确方法是什么?2)不需要花费多少时间来完成(假设网络连接正常)
现在我采取的路径 - 为每个请求创建一个线程并更新一些数据结构,当所有线程完成后,继续评估
这基本上就是我的代码:
private class RetrieveTracks extends AsyncTask<Void, Void, Data> {
private Data data;
@Override
protected Data doInBackground(Void... params) {
data = new Data();
List<Thread> threads = new ArrayList<Thread>();
for (LatLng lat : lats) { //lats is some collection with the LatLng objects I got
Thread thread = new Thread(new DirectionsFinder(lat, data, currentLocation));
threads.add(thread);
thread.start();
}
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return data;
}
@Override
protected void onPostExecute(Data data) {
//update map with Data
}
}
public class DirectionsFinder implements Runnable {
private LatLng lat;
private Data data;
private LatLng curLoc;
public DirectionsFinder(Latlng lat, Data data, LatLng curLoc) {
this.lat = lat;
this.data = data;
this.curLoc = curLoc;
}
@Override
public void run() {
//send GET request to google web api and get the directions
synchronized (data) {
//update data
}
}
}
也是我得到的一个侧面问题 - 在某些情况下,我可能会在执行过程中获得足够的数据,以便我不再需要获取信息,是否有办法“打破”正在运行的线程?
起初我尝试将Callable和FutureTask用于我正在尝试做的事情,但是找不到一个方便的方法来加入这一点非常重要,所以我放弃了它
答案 0 :(得分:0)
我会假设您想要在跟踪检索之后继续之前继续谷歌对所有latlongs的方向响应?您的情况听起来很典型,比如说有一个快递员,他有10个小包送到城里,想要确定最有效的驾驶计划。然后尝试单独获取所有目的地的行车路线有助于计算。每次拨打Google都会最终收到一次旅行的指示,并且有几个请求会在总响应时间内加起来。您可能需要确定等待每个响应的时间限制。我不确定您是否准备放弃或重试缓慢响应的请求。如果您处于运行应用程序的设备的移动环境中,则可能无法确保所有请求的响应时间都合适。这不是一个确凿的答案,但您的回答可以帮助社区提出更准确的建议。