1

バックグラウンド アプリケーションにタイマー タスクを実装しました。

現在の緯度と経度を収集しました。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) 
{
}
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 に答える