1

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

我收集了当前的经纬度。并每 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) 
{
}
4

1 回答 1

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);
         }
      });
   }
于 2013-06-21T02:56:23.583 回答