0

在我的应用程序中,我需要向服务器发送各种POST请求。其中一些请求有响应,而另一些则没有。

这是我用来发送请求的代码:

private static final String TAG = "Server";
private static final String PATH = "http://10.0.0.2:8001/data_connection";
private static HttpResponse response = null;
private static StringEntity se = null;
private static HttpClient client;
private static HttpPost post = null;
public static String actionKey = null;

public static JSONObject sendRequest(JSONObject req) {
    try {
        client = new DefaultHttpClient();

        actionKey = req.getString("actionKey");
        se = new StringEntity(req.toString());
        se.setContentEncoding(new BasicHeader(HTTP.CONTENT_ENCODING, "application/json"));
        se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        post = new HttpPost(PATH);
        post.setEntity(se);

        Log.d(TAG, "http request is being sent");
        response = client.execute(post);
        Log.d(TAG, "http request was sent");

        if (response != null) {
            InputStream in = response.getEntity().getContent();
            String a = convertFromInputStream(in);
            in.close();
            return new JSONObject(a);
        }

    } catch (UnsupportedEncodingException e) {
        Log.d(TAG, "encoding request to String entity faild!");
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        Log.d(TAG, "executing the http POST didn't work");
        e.printStackTrace();
    } catch (IOException e) {
        Log.d(TAG, "executing the http POST didn't work");
        e.printStackTrace();
    } catch (JSONException e) {
        Log.d(TAG, "no ActionKey");
        e.printStackTrace();
    }
    return null;
}

private static String convertFromInputStream(InputStream in)
        throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = br.readLine()) != null) {
        sb.append(line);
    }
    return (sb.toString());
}


这是AsyncTask发送请求的类的代码:

class ServerRequest extends AsyncTask<JSONObject, Void, JSONObject> {

    @Override
    protected JSONObject doInBackground(JSONObject... params) {
        JSONObject req = params[0];
        JSONObject response = Server.sendRequest(req);
        return response;
    }

    @Override
    protected void onPostExecute(JSONObject result) {
        // HANDLE RESULT
        super.onPostExecute(result);
    }
}


当服务器没有返回响应时,我的问题就开始了。AsyncTask即使工作完成后线程仍保持打开状态,因为它从不HTTPClient关闭连接。

有没有办法不等待回复?这肯定会给服务器增加很多开销,因为所有尝试连接到它的 Android 应用程序都会保持连接处于活动状态,并且可能会导致应用程序本身出现许多问题。

基本上,我正在寻找一种方法,它允许我在发送POST请求后立即发送消息并终止连接,因为我没有任何响应。

4

1 回答 1

0

只是,ConnectionTimeOut使用 HttpClient 对象设置,(代码供您理解,在您的情况下可能会有所不同)

int TIMEOUT_MILLISEC = 30000;  
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
HttpClient httpclient = new DefaultHttpClient(httpParams);
HttpPost httppost = new HttpPost(url);
httppost.addHeader("Content-Type", "application/json");

现在,它将在您定义的TimeoOut之后终止连接。但请确保这会抛出TimeOutException,因此您必须在HttpRequest中处理此异常..(使用 Try -catch)

编辑:或者你可以使用HttpRequestExecutor类。

来自包org.apache.http.protocol的类HttpRequestExecutor

protected boolean canResponseHaveBody (HttpRequest request, HttpResponse response)

确定响应是否带有实体。此类中的实现基于 RFC 2616。未知方法和响应代码应该指示与实体的响应。派生的执行器可以覆盖此方法来处理 RFC 2616 中未指定的方法和响应代码。

于 2012-06-21T06:06:38.003 回答