2011-04-04 59 views
0

我有一个应用程序是一个RESTful API使用者,我希望在与API的连接上有一个超时。HttpURLConnection,打开/关闭WiFi并尝试连接的问题

正如我已经搜索并测试,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()

有什么想法?

回答

0

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

具体做法是:

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

我有这个在我的代码,但去掉它,因为当我没有连接到无线网络,也没有3G,它返回真,但现在看起来好了。谢谢! – 2011-04-04 13:51:30

相关问题