У меня есть некоторые проблемы с моим кодом сетевого ввода-вывода в OS 5 BlackBerry.
У меня постоянно возникают спорадические зависания и, в конечном итоге, исключения таймаута TCP во время операций ввода-вывода.
IЯ использую сетевые API-интерфейсы 5.0 для установления соединения, которое работает безупречно каждый раз.
Проблема заключается в выполнении реального ввода-вывода.У меня есть фоновый рабочий поток, который обслуживает запросы ввода-вывода из очереди.Существует только один фоновый поток, поэтому все запросы сериализуются в этот поток.
Уведомление о завершении выполняется через интерфейс делегата, который передается, когда запрос находится в очереди.
Делегат завершениявызывается в фоновом рабочем потоке, но клиенты могут свободно размещать его в потоке событий через invokeLater
для обновления пользовательского интерфейса и т. д.
Примечания:
Мой 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);
}
}
Когда он зависает, он всегда со временем выдает таймаут TCPошибка примерно через 30 секунд или около того.Если бы это происходило время от времени, я бы просто записал это на счет обычной перегрузки сети, но это случается достаточно часто, чтобы указать на более глубокую проблему.
Редактировать:
Это происходит на различныхсимуляторы и 2 физических устройства у меня есть.Симуляторы, которые я пробовал: ...
- Буря 9550
- Тур 9630
- Жирный 9000
- Жемчужина 9100
- Кривая 8530
У меня есть устройства Curve 8530 и Storm 9550, и это также происходит с обоими из них.
Любая помощь будет принята.