尝试实现AsyncTask来发出http请求

时间:2012-08-31 21:43:00

标签: android android-asynctask

我一直在尝试使用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();
    }

}

1 个答案:

答案 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()。你不要用它。