Подключение BlackBerry Http тайм-аут при загрузке изображения.Зачем? - PullRequest
0 голосов
/ 10 июля 2010

Мое приложение просматривает около 200 URL-адресов, которые являются изображениями jpg.В симуляторе он читает нормально, затем сохраняет байтовый массив в persistentStore без проблем.На устройстве это дает исключение java.io.IOException: тайм-аут чтения TCP практически для каждого изображения.Время от времени каждый проходит.Даже не уверен, как.Размеры изображения также не дают понимания.Некоторые 6 КБ, некоторые 11 КБ.Размер не имеет значения для времени ожидания.Я постараюсь опубликовать то, что я считаю соответствующим кодом, но я здесь не совсем эксперт, поэтому, если я что-то упустил, скажите, пожалуйста.Вызовите 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.Переменная chunk - это тест, чтобы проверить, заставлю ли я массив массива в 15 килобайт попытаться прочитать, как ожидалось, поскольку byte [-1] выдал исключение за пределами границ.Результаты одинаковы.Иногда это пишет.В основном это время ожидания.Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 10 июля 2010

Вы можете настроить длительность тайм-аутов TCP на Blackberry, используя параметр ConnectionTimeout.

В вашем коде здесь:

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

Вы хотите добавить ConnectionTimeout. Вы можете написать это в updateConnectionSuffix () или просто добавить.

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

Устанавливает время ожидания 54321 миллисекунд.

Тайм-ауты возникают, когда клиент ожидает, пока сервер отправит подтверждение, и не получит его в течение указанного периода времени.

edit: также, вы можете использовать браузер и прочее? Вы также можете поиграть с параметром устройства.

1 голос
/ 10 июля 2010

Я думаю, что проблема может заключаться в том, что вы закрываете соединение перед чтением байтов из входного потока.Попробуйте переместить connection.close () после считывания байтов.

...