Java HttpURLConnection,打开/关闭WiFi和尝试连接时出现问题
我有一个应用程序,它是RESTfulAPI使用者,我希望在与API的连接上有一个超时 正如我搜索并测试的那样,HttpURLConnection.setReadTimeout()方法不起作用,因此我找到的解决方案是使用一个AsyncTask,它将尝试连接到服务器,然后将超时传递给AsyncTask.get() 它部分有效。问题是当我执行以下操作时:Java HttpURLConnection,打开/关闭WiFi和尝试连接时出现问题,java,android,sockets,networking,Java,Android,Sockets,Networking,我有一个应用程序,它是RESTfulAPI使用者,我希望在与API的连接上有一个超时 正如我搜索并测试的那样,HttpURLConnection.setReadTimeout()方法不起作用,因此我找到的解决方案是使用一个AsyncTask,它将尝试连接到服务器,然后将超时传递给AsyncTask.get() 它部分有效。问题是当我执行以下操作时: 在打开WiFi的情况下输入应用程序。我点击“登录”按钮,得到“无效/用户密码”。嗯 关闭WiFi,单击“登录”按钮。应用程序尝试连接,但在5秒后(
- 在打开WiFi的情况下输入应用程序。我点击“登录”按钮,得到“无效/用户密码”。嗯
- 关闭WiFi,单击“登录”按钮。应用程序尝试连接,但在5秒后(我选择的超时时间),它会显示通知对话框,告诉我未连接。好的,一切如期
- 打开WiFi,单击“登录”按钮。它仍然像我没有连接一样工作,总是显示对话框。我可以等待几秒钟,但行为与断开连接时相同
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();
}
}
}
公共类请求管理器{
private static RequestManager self=new RequestManager();
私人请求;
私有静态最终长超时=5000;
公共静态RequestManager getInstance(){
回归自我;
}
公共无效startRequest(请求){
if(currentRequest!=null)返回;
currentRequest=请求;
}
公共字符串getResponse()引发ConnectionErrorException{
RequestThreat rt=新的RequestThread();
rt.execute(当前请求);
试一试{
返回(字符串)rt.get(超时,时间单位为毫秒);
}捕捉(中断异常e){
}捕获(执行例外){
}捕获(超时异常e){
抛出新的ConnectionErrorException();
}最后{
endRequest();
}
返回null;
}
公共无效endRequest(){
currentRequest=null;
}
私有类RequestThread扩展异步任务{
@凌驾
受保护字符串doInBackground(请求…请求参数){
返回requestParams[0].send().getBody();
}
}
}
同样在方法中,我调用getResponse()
after调用endRequest()
有什么想法吗?在尝试访问网络之前,您应该检查网络连接是否可用。看看这个问题:
具体而言:
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) {
我的代码上有这个,但删除了它,因为当我没有连接到WiFi或3G时,它返回了真值,但现在看起来还行。谢谢