第二个HttpURLConnection失败了

时间:2014-08-24 01:59:14

标签: android exception-handling httpurlconnection

我有ListView onLongClick它调用了一个应该去网站的方法,从中提取jsonArray然后返回从数组中提取的信息。但是,当它调用HttpURLConnection.connect()方法时,它会失败并转到catch块。当我在异常上使用getMessage()消息时,它只返回Null。这是我在这个程序中第二次以相同的方式连接到URL,它第一次完美地工作。可能导致这个问题的原因是什么?

以下是调用方法的代码:

list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

    public boolean onItemLongClick(AdapterView<?> a, View v, int pos, long id) {

        String trainNum = list.getItemAtPosition(pos).toString();
        String info = "hello";
        try {
             info = getCurrentTrainInfo(trainNum);
        }catch(Exception e){
           info = e.getMessage();
            if(info == null)
                info = "info is null";
            tv.setText(info);
        }

        Toast.makeText(getApplicationContext(), info, Toast.LENGTH_LONG).show();

        return true;
    }
}
);

以下是在上面的try块中调用的方法getCurrentTrainInfo

public String getCurrentTrainInfo(String num) throws IOException{

    String sURL = "http://www3.septa.org/hackathon/RRSchedules/" + num;

    URL url = new URL(sURL);
    HttpURLConnection request2 = (HttpURLConnection) url.openConnection();
    request2.connect();

    JsonParser jp = new JsonParser();
    JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent()));
    JsonArray rootArr = root.getAsJsonArray();
    int i = 0;
    String acTime = "";

    String station = rootArr.get(i).getAsJsonObject().get("station").getAsString();
    String schTime = rootArr.get(i).getAsJsonObject().get("sched_tm").getAsString();
    String esTime = rootArr.get(i).getAsJsonObject().get("est_tm").getAsString();

    tv.setText(station);

    String info = "Current Station: " + station + "\nScheduled leave time: " + schTime + "\nEstimated leave time: " + esTime;*/

    return info;
}

我能解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我看到您的请求是在UI thread中提出的,您提到在另一个时刻以相同的方式使用它并且它有效,我相信当您在设备/模拟器上运行应用程序时可能会发生这种情况版本为Android的3.0之前。

  

Android应用程序中,您应该避免执行很长时间   在用户interface thread上运行操作。这包括文件   和网络访问。 StrictMode允许在您的帐户中设置政策   申请,以避免做错误的事情。从Android 3.0 (Honeycomb) StrictMode开始配置为崩溃   如果访问网络,则为NetworkOnMainThreadException例外   用户interface thread

您可以创建一个AsyncTasks课程并将呼叫请求移至该课程。