Java HttpURLConnection,打开/关闭WiFi和尝试连接时出现问题

Java HttpURLConnection,打开/关闭WiFi和尝试连接时出现问题,java,android,sockets,networking,Java,Android,Sockets,Networking,我有一个应用程序,它是RESTfulAPI使用者,我希望在与API的连接上有一个超时 正如我搜索并测试的那样,HttpURLConnection.setReadTimeout()方法不起作用,因此我找到的解决方案是使用一个AsyncTask,它将尝试连接到服务器,然后将超时传递给AsyncTask.get() 它部分有效。问题是当我执行以下操作时: 在打开WiFi的情况下输入应用程序。我点击“登录”按钮,得到“无效/用户密码”。嗯 关闭WiFi,单击“登录”按钮。应用程序尝试连接,但在5秒后(

我有一个应用程序,它是RESTfulAPI使用者,我希望在与API的连接上有一个超时

正如我搜索并测试的那样,HttpURLConnection.setReadTimeout()方法不起作用,因此我找到的解决方案是使用一个AsyncTask,它将尝试连接到服务器,然后将超时传递给AsyncTask.get()

它部分有效。问题是当我执行以下操作时:

  • 在打开WiFi的情况下输入应用程序。我点击“登录”按钮,得到“无效/用户密码”。嗯
  • 关闭WiFi,单击“登录”按钮。应用程序尝试连接,但在5秒后(我选择的超时时间),它会显示通知对话框,告诉我未连接。好的,一切如期
  • 打开WiFi,单击“登录”按钮。它仍然像我没有连接一样工作,总是显示对话框。我可以等待几秒钟,但行为与断开连接时相同
我使用Eclipse一步一步地调试了我所有的代码,逻辑上没有任何问题。 我的HttpURLConnection始终是一个新对象,因此我不会尝试在重新打开WiFi后使用相同的连接对象进行连接。。。 我也在使用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();
        }
    }

}
公共类请求管理器{
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时,它返回了真值,但现在看起来还行。谢谢