2014-10-19 4 views
1

웹 서비스에서 계속 데이터를 가져옵니다.연결이 강제로 끊어지면 BufferedReader.readLine()이 중단됩니다.

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를 반환합니다.
해결책을 제공해주십시오.
덕분에

+0

'URLConnection'에서 읽은 시간 초과 값을 확인할 수 있습니다. 아마도 낮은 값을 설정하면 이전 예외가 트리거됩니다. –

+0

timeout은 45 초로 설정되어 있지만 45 초 후에도 아무 것도 표시되지 않습니다. – Nitish

답변

4

연결시 read timeout으로 설정하십시오. TCP가 끊어지면 연결이 끊어지는 것을 감지하는 데 TCP가 오랜 시간이 걸릴 수 있습니다.

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

작동 솔루션을 제공해 주셔서 감사합니다. – Nitish

1

난 당신이 .readLine()보다는 .read(char[] cbuf, int off, int len)을 사용하고, 자신의 라인 처리를 할 필요가 있다고 생각합니다. 다음은 해당 BufferedReader.read 메서드에 대한 설명서입니다.

이 메서드는 Reader 클래스의 해당 read 메서드의 일반 계약을 구현합니다. 추가로 편의상, 기본 스트림의 read 메소드를 반복적으로 호출하여 가능한 한 많은 문자를 읽으려고합니다.

  • 지정된 수의 문자가 읽은 파일의 마지막을 나타내는 기본이되는 스트림의
  • read 메소드는 -1 반환, 또는 : 읽기 반복은이 다음 조건 중 하나에 해당 될 때까지 계속
  • 기본 스트림의 준비 메소드는 false를 리턴하여 추가 입력 요청이 차단됨을 나타냅니다.

기본 스트림의 첫 번째 읽기가 파일 끝을 나타내는 -1을 반환하면이 메서드는 -1을 반환합니다. 그렇지 않은 경우,이 메소드는 실제로 읽힌 문자 수를 리턴합니다.

(강조 광산.)

그것은 그것이 제공하는 것을 가지고 있는지 기본이되는 스트림을 요구하기 때문에, 블록하지 않는 것이 확실한 read 것처럼 보인다.

은 당신이 묻는대로 많은 문자를 반환하지 않을 수도하지만, 기억하십니까, 그것도이다,하지만 당신은 여전히 ​​하나의 문제가 0

를 돌려주는 일이 있습니다 그 다음에 0을 반환하는 경우 연결이 끊어 졌거나 웹 서버가 아직 아무것도 생성하지 않았기 때문인지 여부를 모릅니다.

+0

답장을 보내 주셔서 감사합니다. – Nitish

관련 문제