2014-10-19 42 views
1

我从Web服务持续获取数据。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'上。也许设置一个较低的值会触发更早的异常。 – 2014-10-19 13:09:12

+0

尽管超时设置为45秒,但即使在45秒后我也没有收到任何内容。 – Nitish 2014-10-19 13:11:51

回答

4

在连接上设置read timeout。如果数据包刚被丢弃,TCP可能需要很长时间才能检测到连接断开。

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

感谢您的工作解决方案。 – Nitish 2014-10-19 13:24:16

1

我认为你需要使用.read(char[] cbuf, int off, int len)而不是.readLine(),并做自己的线处理。下面是该BufferedReader.read方法的文档:

此方法实现Reader类相应read方法的常规协定。作为额外的便利,它通过重复调用底层流的读取方法尝试读取尽可能多的字符。这种迭代读继续,直到以下情况之一变为真:

  • 字符指定数目已经读取,
  • 底层流的读出方法返回-1,表明结束文件,或
  • 底层流的就绪方法返回false,表示进一步的输入请求会阻塞。

如果在基础流上的第一次读取返回-1来指示文件结束,那么此方法返回-1。否则,此方法返回实际读取的字符数。

(重点煤矿。)

看起来好像是read保证不被阻塞,因为它要求底层流不管它是什么东西需要提供。

千万记住,虽然,因为你问它可能不会返回尽可能多的字符,它甚至可能会返回0。

你还有一个问题,虽然,这是,如果它再返回0您不知道是因为连接丢失还是因为Web服务器还没有产生任何东西。

+0

感谢您的回复。 – Nitish 2014-10-19 13:24:45