В моем приложении мне нужно отправить все виды запросов POST
на сервер. некоторые из этих запросов имеют ответы, а другие - нет.Android: отправить сообщение, не отвечающее
это код, я использую для отправки запросов:
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
и убейте соединение сразу после отправки запроса, так как на моем пути нет ответа.
Это не имеет смысла. Почему нет ответа? Если вы не проводите длительный опрос, должен быть какой-то ответ, даже если у него нет тела, просто код состояния. Как вы можете быть уверены, что сервер даже получил ваш запрос, если вы не получили/не подождали ответа? –