gpt4 book ai didi

android - 使用 Android ADK 进行线程阻塞

转载 作者:行者123 更新时间:2023-11-30 04:19:56 25 4
gpt4 key购买 nike

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

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

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

编辑:

我设置了 AsyncTask 来在后台进行读取(尽管我知道我应该为扩展任务使用一个真正的线程),并且它运行良好。

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

BufferedInputStream 会完全减少负载吗?它有自己的 available() 方法。

最佳答案

在回答您编辑过的问题时,不,在 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);
}
}
}
}

关于android - 使用 Android ADK 进行线程阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9422964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com