0

私のアプリケーションは、すべて 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] が範囲外の例外を与えたため、期待どおりに読み取ろうとします。結果は同じです。時々それは書いています。ほとんどの場合、タイムアウトします。

どんな助けでも大歓迎です。

4

2 に答える 2

2

パラメータ「ConnectionTimeout」を使用して、Blackberry の TCP タイムアウトの長さを調整できます。

ここにあなたのコードで:

HttpConnection connection = (HttpConnection)Connector.open(url + updateConnectionSuffix());

ConnectionTimeout を追加する必要があります。updateConnectionSuffix() に書き込むか、単に追加することができます。

    HttpConnection connection = (HttpConnection)Connector.open(url + updateConnectionSuffix() + ";ConnectionTimeout=54321");

これにより、タイムアウトが 54321 ミリ秒に設定されます。

タイムアウトは、クライアントがサーバーが ack を送信するのを待っていて、指定された時間内に ack を受信しない場合に発生します。

編集:また、ブラウザなどを使用できますか?また、deviceside パラメータで遊んでみることもできます。

于 2010-07-10T00:18:24.043 に答える
1

問題は、入力ストリームからバイトを読み取る前に接続を閉じている可能性があると思います。バイトが読み込まれた後、connection.close() を移動してみてください。

于 2010-07-10T06:28:29.987 に答える