1

Androidアプリケーションからcgi phpサーバーにHTTPリクエストを送信して、json応答を取得しています。私のアプリケーションは、HTTP 要求を行う前に、インターネット接続が利用可能かどうかを検証しています。これまで、すべてが正常に機能しています。問題は、HTTP 要求を行った後、インターネット接続が突然切れて、強制終了することがあるということです。

だから私の質問は

  1. サーバーから応答を受け取ったことをどのように理解できますか?
  2. 応答のためにタイマーを保持する必要がありますか?
4

2 に答える 2

5

これがWebリクエスト処理のための私の完璧な実行コードです

public JSONObject connectToService(String url, final Context context ) {

    try {
        if(!isConnected(context)){
            return;
        }

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);

        HttpParams httpParameters = httpGet.getParams();
        // Set the timeout in milliseconds until a connection is established.
        int timeoutConnection = 7500;
        HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
        // Set the default socket timeout (SO_TIMEOUT) 
        // in milliseconds which is the timeout for waiting for data.
        int timeoutSocket = 7500;
        HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

        HttpResponse httpResponse = httpClient.execute(httpGet);
        HttpEntity httpEntity = httpResponse.getEntity();
        InputStream is = httpEntity.getContent();

        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();

        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();

        String jsonString = sb.toString();
        Log.e("WebServiceHandler", "JSON string returned is"+jsonString.toString());

        JSONObject jsonObject = new JSONObject(jsonString);
        return jsonObject;
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (SocketTimeoutException e) {
        e.printStackTrace();
    } catch (ConnectTimeoutException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }

      return null;
}

public boolean isConnected(Context context) {
    ConnectivityManager connMgr = (ConnectivityManager) 
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        return true;
    } else {
        return false;
    }
}

このコードはGETリクエスト用です。POSTリクエストでURLをヒットする場合は、それに応じてこの行を変更するだけです。

HttpGet httpGet = new HttpGet(url);

HttpPost httpPost = new HttpPost(url);
于 2013-01-04T10:51:54.680 に答える
0

接続が遅いためにANR(アプリケーション応答なし)が強制終了する可能性があるため、まずすべてのHTTPプロセスをasyncTaskとして作成し、適切な例外処理を行います。サーバーの応答は、次のコードを使用して確認できます。

    HttpClient httpclient = new DefaultHttpClient(httpParameters);

        HttpGet httpget = new HttpGet(url + encodedData);

        response = httpclient.execute(httpget);
于 2013-01-04T10:40:15.520 に答える