我有一个有趣的问题。
我有一个应用程序,其中,我正在尝试考虑手机连接到路由器的情况,但该路由器未连接到互联网。
我已经尝试了多种建立连接的方法,但没有超时可以解释这种情况。
我试过了:
HttpParams httpParameters = new BasicHttpParams();
int timeoutSocket = 1000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutSocket);
我也试过了:
HttpURLConnection huc = (HttpURLConnection)serverAddress.openConnection();
huc.setDoOutput(true);
huc.setRequestMethod("PUT"); // For amazon
//huc.setRequestMethod("POST"); // For regular server.
huc.setRequestProperty("Content-Type", "text/plain");
huc.setRequestProperty("Content-Length", String.valueOf(bytes));
huc.setFixedLengthStreamingMode(bytes);
huc.setConnectTimeout(1000); // Establishing connection timeout
huc.setReadTimeout(1000);
但在两种情况下,当我执行/获取输出流时,接收UnknownHostException错误大约需要20秒。
我希望在达到该结论之前将其减少到最多5秒。
有没有办法做到这一点?
干杯
答案 0 :(得分:2)
通过大量搜索并通过this链接的帮助,我找到了一个可靠的解决方案,到目前为止它已经开始工作了。
我对结论的理解是,当我使用以下方法时:
DataOutputStream wr = new DataOutputStream(huc.getOutputStream());
或
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
(上传或下载)
引擎盖下发生了很多事情。包括DNS查找调用。没有连接,但连接到路由器时,这需要大约20秒才能最终达到UnknownHostException。
但是,如果我在执行上述代码之前先添加这行代码:
InetAddress iAddr = InetAddress.getByName("myserverName.com");
然后它会给我正确的SocketTimeOutException并准确地响应我希望/期望它的方式。上面的代码行显然缓存了DNS查找,并且超时按预期工作。
另外需要注意的是:一旦缓存了故障,执行上面的代码将会像其他先前的代码一样失败。 (不能确切地告诉你什么会触发这个)但是如果再次连接到互联网,然后再次进入已连接但没有连接状态,则先前的成功将被缓存,超时将再次正常工作。
这不是特别容易找到或弄清楚,所以我希望这有助于某人。
干杯,
答案 1 :(得分:0)
您可以实现限制为5000毫秒的CountDownTimer,请参阅此http://dewful.com/?p=3