黑莓手机10分钟后网络连接失败

时间:2013-06-20 05:13:40

标签: blackberry java-me

我在后台应用程序上实现了计时器任务。

我收集了当前的lat和long。并且每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 个答案:

答案 0 :(得分: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);
         }
      });
   }