我有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;
}
我能解决这个问题吗?
答案 0 :(得分:0)
我看到您的请求是在UI thread
中提出的,您提到在另一个时刻以相同的方式使用它并且它有效,我相信当您在设备/模拟器上运行应用程序时可能会发生这种情况版本为Android
的3.0之前。
在
Android
应用程序中,您应该避免执行很长时间 在用户interface thread
上运行操作。这包括文件 和网络访问。StrictMode
允许在您的帐户中设置政策 申请,以避免做错误的事情。从Android 3.0 (Honeycomb) StrictMode
开始配置为崩溃 如果访问网络,则为NetworkOnMainThreadException
例外 用户interface thread
。
您可以创建一个AsyncTasks课程并将呼叫请求移至该课程。