Android - 发送许多请求的正确方法

时间:2014-10-17 07:17:16

标签: java android multithreading

我正在开展一个快速响应非常重要的项目,基本上它的作用是获取用户的当前位置,获得一堆本地存储的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用于我正在尝试做的事情,但是找不到一个方便的方法来加入这一点非常重要,所以我放弃了它

1 个答案:

答案 0 :(得分:0)

我会假设您想要在跟踪检索之后继续之前继续谷歌对所有latlongs的方向响应?您的情况听起来很典型,比如说有一个快递员,他有10个小包送到城里,想要确定最有效的驾驶计划。然后尝试单独获取所有目的地的行车路线有助于计算。每次拨打Google都会最终收到一次旅行的指示,并且有几个请求会在总响应时间内加起来。您可能需要确定等待每个响应的时间限制。我不确定您是否准备放弃或重试缓慢响应的请求。如果您处于运行应用程序的设备的移动环境中,则可能无法确保所有请求的响应时间都合适。这不是一个确凿的答案,但您的回答可以帮助社区提出更准确的建议。