我有一個應用程序是一個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()
。
有什麼想法?
我有這個在我的代碼,但去掉它,因爲當我沒有連接到無線網絡,也沒有3G,它返回真,但現在看起來好了。謝謝! – 2011-04-04 13:51:30