私のアプリケーションは、すべて jpg 画像である約 200 個の URL をループします。シミュレーターでは問題なく読み取り、バイト配列をpersistentStoreに問題なく保存します。デバイスでは、基本的にすべてのイメージで java.io.IOException: TCP read timed out が発生します。時々、1人が通り抜けます。方法さえわかりません。画像サイズも洞察を与えません。6k のものもあれば、11k のものもあります。サイズはタイムアウトには関係ないようです。
関連するコードであると思われるものを投稿しようとしますが、私はここの専門家ではないので、何かを省略した場合はそのように言ってください.
ループを介して http 接続を呼び出し、スレッドに参加します。
for(int i = 0; i < images.size(); i ++)
{
try {
String url = images.elementAt(i).toString();
HttpRequest data3 = new HttpRequest(url, "GET", false);
data3.start();
data3.join();
} catch (IOException e) {
Dialog.inform("wtf " + e);
}
}
適切なサフィックスを使用して HttpConnection クラスで実際の接続を行います。
try
{
HttpConnection connection = (HttpConnection)Connector.open(url + updateConnectionSuffix());
int responseCode = connection.getResponseCode();
if(responseCode != HttpConnection.HTTP_OK)
{
connection.close();
return;
}
String contentType = connection.getHeaderField("Content-type");
long length = connection.getLength();
InputStream responseData = connection.openInputStream();
connection.close();
outputFinal(responseData, contentType, length);
}
catch(IOException ex)
{
} catch (SAXException ex) {
} catch (ParserConfigurationException ex) {
}
最後に、ストリームを読み取り、バイトをバイト配列に書き込みます。
else if(contentType.equals("image/png") || contentType.equals("image/jpeg") || contentType.equals("image/gif"))
{
try
{
if((int) length < 1)
length = 15000;
byte[] responseData = new byte[(int) length];
int offset = 0;
int numRead = 0;
StringBuffer rawResponse = new StringBuffer();
int chunk = responseData.length-offset;
if(chunk < 1)
chunk = 1024;
while (offset < length && (numRead=result.read(responseData, offset, chunk)) >= 0){
rawResponse.append(new String(responseData, offset, numRead));
offset += numRead;
}
String resultString = rawResponse.toString();
byte[] dataArray = resultString.getBytes();
result.close();
database db = new database();
db.storeImage(venue_id, dataArray);
}
catch( Exception e )
{
System.out.println(">>>>>>>----------------> total image fail: " + e);
}
}
考慮事項:
シミュレーターでは、長さは常にバイト長です。デバイスでは常に -1 です。
チャンク var は、15k バイトの配列を強制するかどうかを確認するためのテストです。バイト [-1] が範囲外の例外を与えたため、期待どおりに読み取ろうとします。結果は同じです。時々それは書いています。ほとんどの場合、タイムアウトします。
どんな助けでも大歓迎です。