我的BlackBerry OS 5上的網絡I/O代碼有問題。網絡I/O掛在BlackBerry OS 5上
在我的I/O操作期間,我不斷收到零星的掛起和最終的TCP超時異常。
我使用5.0網絡API來建立每次完美工作的連接。
問題在於執行實際的I/O時。我有一個後臺工作線程來處理來自隊列的I/O請求。只有一個後臺線程,所以所有請求都被序列化到這個線程上。
完成通知是通過請求排隊時傳入的委託接口完成的。
完成委託調用後臺工作線程,但客戶可以自由通過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
- 粗體9000
- 明珠9100
- 曲線8530
我有一個曲線8530和Storm 9550設備,它也發生在這兩者上。
任何幫助,將不勝感激。
這是在模擬器或真實設備? – 2010-07-08 19:56:56
添加設備和模擬器信息。 – 2010-07-08 21:01:54
我問的原因是因爲我發現5.0模擬器在網絡仿真方面相當麻煩 - 通常掛起連接沒有明顯的原因。但是,既然你也在真實設備上看到它,它肯定是不同的。 – 2010-07-08 21:31:13