我一直在尝试使用JSON对象和距离矩阵api来实现asynctask来发出大约30个http请求来查找两个位置之间的距离。我写的代码在从主UI线程调用时起作用,但是当我尝试从异步任务运行它并将距离保存到数组时,我最终得到一个充满空值的数组。有什么建议? (注意:这段代码最初由我工作的其他人编写,我只是复制粘贴它并更改了几行以使用我的应用程序。所以,可能会有一些我不知道的不必要的部分。感觉自由指出他们)
class DistanceFinder extends AsyncTask<String[], Void, String[]>
{
@Override
protected String[] doInBackground(String[]... locations)
{
String baseURL="https://maps.googleapis.com/maps/api/distancematrix/json?origins=";
String[] distances = new String[locations[1].length];
for(int i = 1;i<locations.length;i++)
{
String url = baseURL + locations[0][0].replace(" ","+") + "&destinations=" + locations[1][i].replace(' ', '+') + "&sensor=true&units=imperial";
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response;
String responseString = "";
boolean internet;
try
{
response = httpclient.execute(new HttpGet(url));
StatusLine statusLine = response.getStatusLine();
if(statusLine.getStatusCode() == HttpStatus.SC_OK)
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
response.getEntity().writeTo(out);
out.close();
responseString = out.toString();
internet=true;
}
else
{
response.getEntity().getContent().close();
throw new IOException(statusLine.getReasonPhrase());
}
} catch (ClientProtocolException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
internet=false;
Toast.makeText(getApplicationContext(), "Please connect to internet", Toast.LENGTH_LONG).show();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
internet=false;
Toast.makeText(getApplicationContext(),"Please connect to internet", Toast.LENGTH_LONG).show();
}
if(internet){
try
{
JSONObject jsonObj = new JSONObject(responseString);
JSONArray rows = jsonObj.getJSONArray("rows");
JSONObject inRows=rows.getJSONObject(0);
JSONArray elements = inRows.getJSONArray("elements");
JSONObject inElements=elements.getJSONObject(0);
JSONObject distance= inElements.getJSONObject("distance");
distances[i] = distance.getString("text");
}
catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return distances;
}
@Override
protected void onPostExecute(String[] result)
{
// TODO Auto-generated method stub
super.onPostExecute(result);
distancesList = result;
}
@Override
protected void onPreExecute()
{
// TODO Auto-generated method stub
super.onPreExecute();
}
}
答案 0 :(得分:0)
你的问题在于循环
for(int i = 1;i<locations.length;i++)
首先,你应该从0开始,除非你的第一个单元格没有存储String
,你希望你检查距离。
其次,你的for循环应该是
for(int i = 0;i<locations[0].length;i++)
现在你正在检查单元格[1][0]
,就是这样,因为循环结束了。
我用手动输入的位置对它进行了测试,结果正常。
另外,为了让您更容易调试,您应该习惯使用Log.d()
。它确实有助于搞清楚错误。我在你的代码中使用它,看到循环只执行一次。
P.s,如其中一条评论中所述,删除onPreExecute()
。你不要用它。