2013-06-20 3 views
1

Я выполнил задачу таймера в фоновом приложении.Сетевое соединение Не удалось через 10 минут на ежевике

Я собрал ток лат и долго. и отправлять на сервер каждые 30 секунд.

Я использовал ниже код для отправки информации на сервер. Он успешно отправляется.

Моя проблема в том, что после того, как я проверил 10 минут, я не могу отправить. он выдает ошибку «Нет сети». Я также проверял браузер, но не сети.

Если перезагрузите устройство, его работа снова хорошо. Но та же проблема возникает через 5 или 10 минут.

Как это решить?

Мой код,

try 
{ 
    StreamConnection connection = (StreamConnection) Connector.open(url+suffix); 
    ((HttpConnection) connection).setRequestMethod(HttpConnection.GET); 
    int responseCode = ((HttpConnection) connection).getResponseCode(); 
    if (responseCode != HttpConnection.HTTP_OK) { 
     showDialog("Unexpected response code :"+ responseCode); 
     connection.close(); 
     return; 
    } 
    ((HttpConnection) connection).getHeaderField("Content-type"); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    InputStream responseData = connection.openInputStream(); 
    byte[] buffer = new byte[1000]; 
    int bytesRead = responseData.read(buffer); 
    while (bytesRead > 0) { 
     baos.write(buffer, 0, bytesRead); 
     bytesRead = responseData.read(buffer); 
    } 
    baos.close(); 
    connection.close(); 
    String s = new String(baos.toByteArray()); 
    showDialog("Responce from server "+s); 
} 
catch (IOException e) 
{ 
} 

ответ

1

Обычно, когда у вас есть какие-то проблемы, где она работает в несколько раз, а затем перестает работать, и вам нужно сбросить устройство, вы сделали то, что использовал все доступные ресурсы, не отпуская их, когда вы закончите.

При выполнении повторных сетевых операций вы должны очищать свои потоки и соединения после каждого использования.

Обычно правильный способ писать код сети, чтобы объявить сетевые переменные вне try блока, назначать и использовать их внутри try, при ловле любого IOExceptions брошенных. Затем вы используете блок finally, чтобы очистить ваши ресурсы, независимо от того, закончен ли код успешно или нет.

Я также отметить, что при отладке сетевых проблем, вы не хотите иметь catch() обработчик, который просто улавливает исключения и ничего не делает с ними. Распечатайте сообщение на консоли (для тестирования) или запишите ошибку в файл.

Наконец, я не вижу ваш метод showDialog(), но если он отображает пользовательский интерфейс для пользователя/тестера, вам нужно сделать это в потоке пользовательского интерфейса. Но сетевой код, который вы показываете выше, должен запускаться в фоновом потоке, чтобы поддерживать пользовательский интерфейс. Итак, внутри showDialog(), просто убедитесь, что вы используете код для изменения пользовательского интерфейса в потоке пользовательского интерфейса.

Таким образом, лучше реализация может быть таким:

private void requestFromServer() { 
     StreamConnection connection = null; 
     ByteArrayOutputStream baos = null; 
     InputStream responseData = null; 
     try 
     { 
     connection = (StreamConnection) Connector.open(url+suffix); 
     ((HttpConnection) connection).setRequestMethod(HttpConnection.GET); 
     int responseCode = ((HttpConnection) connection).getResponseCode(); 
     if (responseCode != HttpConnection.HTTP_OK) { 
      showDialog("Unexpected response code :"+ responseCode); 
      return; 
     } 
     ((HttpConnection) connection).getHeaderField("Content-type"); 
     baos = new ByteArrayOutputStream(); 
     responseData = connection.openInputStream(); 
     byte[] buffer = new byte[1000]; 
     int bytesRead = responseData.read(buffer); 
     while (bytesRead > 0) { 
      baos.write(buffer, 0, bytesRead); 
      bytesRead = responseData.read(buffer); 
     }   
     String s = new String(baos.toByteArray()); 
     showDialog("Responce from server "+s); 
     } 
     catch (IOException e) 
     { 
     System.out.println("Network error: " + e.getMessage()); 
     } 
     finally 
     { 
     try { 
      if (connection != null) { 
       connection.close(); 
      } 
      if (baos != null) { 
       baos.close(); 
      } 
      if (responseData != null) { 
       responseData.close(); 
      }    
     } catch (IOException e) { 
      // nothing to do here   
     }   
     } 
    } 

    private void showDialog(final String msg) { 
     UiApplication.getUiApplication().invokeLater(new Runnable() { 
     public void run() { 
      Dialog.alert(msg); 
     } 
     }); 
    } 
Смежные вопросы