我有一个RESTful API使用者的应用程序,我希望我与API的连接超时。
当我搜索并测试时,HttpURLConnection.setReadTimeout()方法不起作用,因此我找到的解决方案是使用AsyncTask,它将尝试连接到服务器,然后将超时传递给AsyncTask.get()。
部分有效。问题是当我执行以下操作时:
我使用Eclipse逐步调试了所有代码,逻辑没有任何问题。 我的HttpURLConnection总是一个新对象,所以我不打算在打开WiFi之后使用相同的连接对象进行连接... 另外我正在使用Scribe库,用于OAuth,但我检查了源代码,一切似乎都没问题,除了我更改了创建连接的方法以始终使用新实例。
我开始认为Android正在“缓存”我的连接对象或AsyncTask对象......
在我的RequestManager类的一些代码下面:
public class RequestManager {
private static RequestManager self = new RequestManager();
private Request currentRequest;
private static final long TIMEOUT = 5000;
public static RequestManager getInstance() {
return self;
}
public void startRequest(Request request) {
if (currentRequest != null) return;
currentRequest = request;
}
public String getResponse() throws ConnectionErrorException {
RequestThreat rt = new RequestThread();
rt.execute(currentRequest);
try {
return (String) rt.get(TIMEOUT, TimeUnit.MILISECONDS);
} catch (InterruptedException e) {
} catch (ExecutionException e) {
} catch (TimeoutException e) {
throw new ConnectionErrorException();
} finally {
endRequest();
}
return null;
}
public void endRequest() {
currentRequest = null;
}
private class RequestThread extends AsyncTask<Request, Integer, String> {
@Override
protected String doInBackground(Request... requestParams) {
return requestParams[0].send().getBody();
}
}
}
同样在我调用getResponse()
的方法中,我之后调用了endRequest()
。
有什么想法吗?
答案 0 :(得分:0)
在尝试访问网络之前,您应该检查网络连接是否可用。看看这个问题:
具体做法是:
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) {