【问题标题】:How to stop a BufferedReader after a certain amount of time in Android如何在 Android 中经过一定时间后停止 BufferedReader
【发布时间】:2018-08-28 23:10:59
【问题描述】:

我有一个线程可以打开一个向服务器发送数据的套接字。如果有人在工作站,服务器可能会发回数据。但是我试图在 BufferedReader 上设置一个超时,以便在 30 秒后它继续说响应为空。

//Receive Response
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
response = new StringBuilder();
while ((line = bufferedReader.readLine()) != null ) {
    response.append(line);
}

这是我的BufferedReader,非常标准,我查看了一堆计时器和其他帖子,但没有找到可行的解决方案。

【问题讨论】:

    标签: java android bufferedreader


    【解决方案1】:

    您可以在您的套接字实例上调用setSoTimeout()

    当达到超时时间时,它将引发SocketTimeoutException。将您的阅读逻辑包装在一个 try-catch 块中,捕获该异常并按照您的意愿处理它。

    类似这样的:

    try {
        socket.setSoTimeout(30000);
    
        bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        while ((line = bufferedReader.readLine()) != null ) {
            response.append(line);
        }
    } catch (SocketTimeoutException ste) {
        // timeout reached
    } catch (Exception e) {
        // something else happened
    } finally {
        // some general processing
    }
    

    【讨论】:

    • 我希望在不断开套接字的情况下这样做。
    • @Demonic218 来自其文档:“如果超时到期,则会引发 java.net.SocketTimeoutException,尽管 Socket 仍然有效。”
    • 抱歉,之前的评论有点混乱。我在缓冲读取器之后有代码来读取响应,例如批准、拒绝,30 秒后它应该为空。但是,当超时发生时,它似乎直接跳到异常而不是读取响应。
    • @Demonic218 异常发生时响应仍在response变量中,您可以在catch块中处理它,或者在finally块中处理。