2011-04-04 95 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

相關問題