2013-06-20 5 views
1

백그라운드 어플리케이션에 타이머 태스크를 구현했습니다.블랙 베리에서 10 분 후에 네트워크 연결에 실패했습니다.

나는 현재 위도와 경도를 수집했습니다. 각 30 초마다 서버에 보냅니다.

아래 코드를 사용하여 정보를 서버로 보냈습니다. 그것은 성공적으로 ..

내 문제는 10 분을 확인한 후에 보낼 수 없다는 것입니다. No Network 오류가 발생합니다. 나는 브라우저도 체크했지만 네트워크는 없다.

기기를 재설정하는 경우 기기가 제대로 작동합니다. 그러나 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 블록 외부 네트워크 변수를 선언 할당하고 던져 어떤 IOExceptions를 잡는 동안 try 내부를 사용하는 것입니다. 그런 다음 코드가 성공적으로 완료되었는지 여부에 관계없이 finally 블록을 사용하여 리소스를 정리합니다.

디버깅 네트워크 문제가 발생하면 단순히 예외를 트랩하고 아무 것도 수행하지 않는 catch() 처리기를 원하지 않습니다. 테스트 용 콘솔에 메시지를 인쇄하거나 오류를 파일에 기록하십시오.

마지막으로 사용자의 showDialog() 메서드가 표시되지 않지만 사용자/테스터에게 UI가 표시되는 경우 UI 스레드에서 UI를 표시해야합니다. 그러나 위에 표시된 네트워크 코드는 백그라운드 스레드에서 실행되어 UI를 응답 가능하게 유지해야합니다. 따라서 showDialog() 안에 코드를 사용하여 UI 스레드에서 UI를 수정해야합니다.

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); 
     } 
     }); 
    } 
:

그래서, 더 나은 구현이있을 수 있습니다

관련 문제