2012-06-21 3 views
0

В моем приложении мне нужно отправить все виды запросов 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 и убейте соединение сразу после отправки запроса, так как на моем пути нет ответа.

+1

Это не имеет смысла. Почему нет ответа? Если вы не проводите длительный опрос, должен быть какой-то ответ, даже если у него нет тела, просто код состояния. Как вы можете быть уверены, что сервер даже получил ваш запрос, если вы не получили/не подождали ответа? –

ответ

0

Просто, набор ConnectionTimeOut с HttpClient Object (Код для вашего понимания в вашем случае может отличаться)

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 .. (использование Попробуйте -catch)

EDIT: Или вы можете использовать HttpRequestExecutor класс.

От класса HttpRequestExecutor пакета org.apache.http.protocol

protected boolean canResponseHaveBody (HttpRequest request, HttpResponse response) 

Decide приходит ли ответ с объектом. Реализация в этом классе основана на RFC 2616. Неизвестные методы и коды ответов должны указывать ответы с сущностью. Производные исполнители могут переопределить этот метод для обработки методов и кодов ответов, не указанных в RFC 2616.

Смежные вопросы