簡體   English   中英

強制斷開連接時,BufferedReader.readLine()掛起

[英]BufferedReader.readLine() hangs when connection forcefully disconnected

我不斷從Web服務獲取數據。

URLConnection connection;
    BufferedReader in = null;

    try {
        SharedPreferences preferences = context.getSharedPreferences(
                "MyPreferences", Context.MODE_PRIVATE);
        int timeoutConnection = Integer.parseInt(preferences.getString(
                "timeout", "60")) * 1000;
        URL urlAddress = new URL(preferences.getString("apiUrl",
                defaultURL));
        connection = urlAddress.openConnection();
        connection.setConnectTimeout(timeoutConnection);
        in = new BufferedReader(new InputStreamReader(
                connection.getInputStream()));
        final String[] inputLine = { null };
        int i=0;
        while (isOnline() && (inputLine[0] = in.readLine()) != null) {   // isOnline checks if connected to internet.
            ((Activity) context).runOnUiThread(new Runnable() {
                    public void run() {
                        callback.run(inputLine[0]);
                    }
                });
        }
    } catch (Exception e) {
        ..
        ..
    }  

直到我連接到互聯網,這才能正常工作。 但是,一旦我強行斷開連接, inputLine[0] = in.readLine()就不會響應。 我沒有例外。
那么如何檢查兩者之間的連接是否斷開? 僅使用readLine()或其他方式。
注意 :我很少看到建議使用BufferedReader.ready()解決方案。 我也嘗試過,但總是返回false。
請為我提供一個可行的解決方案。
謝謝

設置連接的讀取超時 如果只是丟棄數據包,TCP可能需要很長時間才能檢測到斷開的連接。

    connection = urlAddress.openConnection();
    connection.setReadTimeout(10000); // 10 seconds
    connection.setConnectTimeout(timeoutConnection);

我認為您需要使用.read(char[] cbuf, int off, int len)而不是.readLine() ,然后進行自己的行處理。 這是該BufferedReader.read方法的文檔:

此方法實現Reader類的相應read方法的常規協定。 作為一個額外的便利,它嘗試通過重復調用基礎流的讀取方法來讀取盡可能多的字符。 重復執行此迭代讀取,直到滿足以下條件之一:

  • 已讀取指定數量的字符,
  • 基礎流的read方法返回-1,表示文件結束,或者
  • 基礎流的ready方法返回false,指示其他輸入請求將被阻止。

如果對基礎流的第一次讀取返回-1表示文件結束,則此方法返回-1。 否則,此方法返回實際讀取的字符數。

(強調我的。)

看起來保證不會阻止read ,因為它詢問基礎流是否有任何東西可提供。

不過請記住,它可能不會返回您要求的字符數,甚至可能返回0。

但是,您仍然有一個問題,那就是如果它返回0,那么您不知道是由於連接斷開還是Web服務器尚未產生任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM