HttpURLConnection,打开/关闭WiFi并尝试连接的问题

时间:2011-04-04 12:33:32

标签: java android sockets networking

我有一个RESTful API使用者的应用程序,我希望我与API的连接超时。

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

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

  • 在WiFi开启的情况下输入应用程序。我单击“登录”按钮并获得“无效/用户密码”。确定。
  • 关闭WiFi,点击“登录”按钮。应用程序尝试连接但在5秒后(我选择的超时)它会显示通知对话框,说我没有连接。好的,一切都如预期的那样。
  • 打开WiFi,点击“登录”按钮。它仍然工作,好像我没有连接,总是显示对话框。我可以等待很多秒,但行为与我断开连接时的行为相同。

我使用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()

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在尝试访问网络之前,您应该检查网络连接是否可用。看看这个问题:

具体做法是:

NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) {