1

我正在尝试从附件读取字节InputStream而不阻塞线程(如果可能)。

通常,我会将read(buffer)调用包装在 中if available(),但是 available() 会引发异常(即使 read() 在 InputStream 上工作正常)。

是否有任何其他解决方案可以最大限度地减少线程阻塞?

编辑:

我设置AsyncTask在后台进行阅读(尽管我知道我应该使用真正的线程来完成扩展任务),而且效果很好。

我想真正的问题是,后台线程不断被“读取”调用阻塞是否会对性能造成任何损害?现在没有效果,但是应用程序很快就会变得非常密集,我希望至少使通信尽可能轻量级。

BufferedInputStream完全减轻负担吗?那有它自己的 available() 方法。

4

2 回答 2

1

read()在回答您编辑的问题时,不,在调用时阻塞后台线程不会影响性能。基本上就好像后台线程正在休眠一样。

但是,如果您继续生成后台线程,并且继续让所有这些线程read()永远处于阻塞状态,那么您将面临非常严重的内存泄漏。它不会降低速度或类似方面的性能,但最终会使您的应用程序崩溃。

所以是的,确保您的后台线程最终终止是很重要的(或者至少要保证如果现有线程没有终止,您的代码不会继续尝试添加新线程)。

这应该处理原始问题:

public interface StreamDataHandler {
    public void handleData(byte[] buffer, int numBytes);
    public void readFailedWithError(Exception ex);
}

public class DataReader extends Thread {
    private StreamDataHandler handler;
    private InputStream input;

    public DataReader(InputStream in, StreamDataHandler handler) {
        super();
        this.input = in;
        this.handler = handler;
    }

    @Override
    public void run() {
        int numRead = 0;
        byte[] buffer = new byte[1024];
        try {
            while ((numRead = input.read(buffer)) != -1) {
                if (this.handler != null && numRead > 0) {
                    this.handler.handleData(buffer, numRead);
                }
            }
        }
        catch (Exception e) {
            if (this.handler != null) {
                this.handler.readFailedWithError(e);
            }
        }
    }
}
于 2012-02-23T23:31:53.163 回答
0

您可以尝试使用 Runnable 或 AsyncTask 来解决任何线程阻塞问题。

可运行

异步任务

或者,您可以查看引发该异常的原因。您可以捕获异常,然后重复调用 TimerTask 'available()',直到它成功。

定时器任务

于 2012-02-23T23:21:19.627 回答