gpt4 book ai didi

java - 网络 I/O 在 BlackBerry OS 5 上挂起

转载 作者:行者123 更新时间:2023-12-01 18:03:44 27 4
gpt4 key购买 nike

我在 BlackBerry 操作系统 5 上的网络 I/O 代码存在一些问题。

在 I/O 操作期间,我不断遇到零星的挂起,并最终出现 TCP 超时异常。

我使用 5.0 网络 API 来建立每次都能完美运行的连接。

问题出在执行实际 I/O 时。我有一个后台工作线程,为队列中的 I/O 请求提供服务。只有一个后台线程,因此所有请求都序列化到该线程上。

完成通知是通过请求排队时传入的委托(delegate)接口(interface)完成的。

完成委托(delegate)在后台工作线程上调用,但客户端可以通过 invokeLater 将其重新发布到事件线程以进行 UI 更新等。

注释:
HttpRequest 是我自己的类,它保存有关请求的数据。
MutableData 是我自己的类,用于保存读取的数据。
BUFFER_SIZE = 2048

HttpConnection getConnectionForRequest(final HttpRequest inRequest) {
final String url = inRequest.getURL();
final int[] availableTransportTypes =
TransportInfo.getAvailableTransportTypes();
final ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setPreferredTransportTypes(availableTransportTypes);
connectionFactory.setConnectionMode(ConnectionFactory.ACCESS_READ);
final ConnectionDescriptor connectionDescriptor =
connectionFactory.getConnection(url);
HttpConnection connection = null;
if (connectionDescriptor != null) {
connection = (HttpConnection) connectionDescriptor.getConnection();
}
return connection;
}

public void run() {
while (isRunning()) {
// This blocks waiting on a request to appear in the queue.
final HttpRequest request = waitForRequest();
final HttpConnection connection = getConnectionForRequest(request);
final MutableData data = new MutableData();
final InputStream inputStream = connection.openInputStream();
final byte[] readBuffer = new byte[BUFFER_SIZE];
int chunkSize;
// *** The following read call sporadically hangs and eventually throws
// a TCP timeout exception.
while((chunkSize = inputStream.read(readBuffer, 0, BUFFER_SIZE)) != -1) {
data.appendData(readBuffer, 0, chunkSize);
}
mDelegate.receivedDataForRequest(request, data);
}
}

当它挂起时,它总是会在大约 30 秒左右后最终抛出 TCP 超时错误。如果这种情况偶尔发生,我会将其归咎于正常的网络拥塞,但它发生的频率足以表明存在更深层次的问题。

编辑:

它发生在各种模拟器和我拥有的 2 个物理设备上。我尝试过的模拟器是...

  • 暴风9550
  • 游览9630
  • 粗体 9000
  • 珍珠9100
  • 曲线8530

我有 Curve 8530 和 Storm 9550 设备,这两台设备上也出现这种情况。

如有任何帮助,我们将不胜感激。

最佳答案

您可能想尝试 Available()方法。尽管您在一个后台线程上序列化数据,但看起来该请求是在主线程中创建的。您可能会遇到一些奇怪的竞争条件。

关于java - 网络 I/O 在 BlackBerry OS 5 上挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3207370/

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