我试图从配件的InputStream
读取字节而不阻塞线程(如果可能的话)。
通常,我会将read(buffer)
调用包装在if available()
中,但是available()会抛出异常(即使read()在InputStream上运行正常)。
是否有其他解决方案可以最大程度地减少线程阻塞?
编辑:
我设置AsyncTask
在后台进行阅读(虽然我知道我应该使用一个真正的线程进行扩展任务),并且它工作正常。
我想真正的问题是,通过“阅读”不断阻止后台线程是否会对性能造成任何损害?呼叫?现在没有效果,但应用程序很快就会变得非常密集,我希望至少使通信尽可能轻松。
BufferedInputStream
会减轻负荷吗?这有它自己的available()方法。
答案 0 :(得分: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);
}
}
}
}
答案 1 :(得分:0)