2013-06-20 66 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()方法,但是如果它向用戶/測試人員顯示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); 
     } 
     }); 
    }