Тайм-аут запроса HttpPost для Android - PullRequest
1 голос
/ 30 января 2012

В моем приложении мне нужно получить данные из 4 разных URL, а затем, после завершения выборки данных, я должен показать элементы в определенной последовательности. Я использую HttoPost для отправки почтового запроса. Я посылаю 4 запроса каждый в другой теме. Когда поток получает данные, он увеличивает счетчик. Когда счетчик достигает 4, это означает, что все 4 потока извлекли данные. Проблема в том, что иногда один из четырех потоков не отвечает, значит defaultHttpClient.execute (post) не возвращается. Из-за этого мой счет не достигает 4, даже если он не выдает исключение, а продолжает отображаться только диалог ожидания. Я хочу, чтобы через определенное время он возвращался независимо от того, получит ли он ответ от сервера или нет. Есть идеи?

Ответы [ 2 ]

4 голосов
/ 30 января 2012

Это не работает. Я использую следующий класс:

public class ConnectionManager {

private  ArrayList <NameValuePair> params;
private  ArrayList <NameValuePair> headers;
private String url;

public ConnectionManager(String url) {
    this.url = url;
    params = new ArrayList<NameValuePair>();
    headers = new ArrayList<NameValuePair>();
}

public void addParam(String name, String value)
{
    params.add(new BasicNameValuePair(name, value));
}

public void addHeader(String name, String value)
{
    headers.add(new BasicNameValuePair(name, value));
}

public String sendRequest() throws Exception {
    String serverResponse = "";
    HttpPost httpPostRequest = new HttpPost(url);
    httpPostRequest.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);
    //add headers
    for(int i = 0; i < headers.size(); i++) {
        StringEntity entity = new StringEntity(headers.get(i).getValue(),"UTF-8");
        httpPostRequest.setEntity(entity);
    }

    if(!params.isEmpty()){
        HttpEntity httpEntity = new UrlEncodedFormEntity(params,HTTP.UTF_8);
        httpPostRequest.setEntity(httpEntity);
    }

    serverResponse = executeRequest(httpPostRequest);
    return serverResponse;
}

private String executeRequest(HttpUriRequest request) throws Exception  {

    HttpParams params = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(params, 3000);
    HttpConnectionParams.setSoTimeout(params, 10000);
    DefaultHttpClient client = new DefaultHttpClient(params);

    HttpResponse httpResponse;
    String serverResponse = "";
    httpResponse = client.execute(request);
    HttpEntity entity = httpResponse.getEntity();
    if (entity != null) {
        InputStream instream = entity.getContent();
        serverResponse = convertStreamToString(instream);
        instream.close();
    }
    Log.d("server response", serverResponse);
    return serverResponse;
}

private String convertStreamToString(InputStream is) {

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}
1 голос
/ 30 января 2012

использование

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