简体   繁体   中英

Which is the best way to implement timeout for HTTP request in Android?

That my sample!

private void onGet( String command, int requestType ){
    HttpGet getRequest = new HttpGet("http://" + getHost() + ":" + getPort() + getServerCgiPath() + command);
    Client.sendRequest(getRequest, requestType, getCallBack() );
}

... Right there i have created my HttpClient

    public class Client {    
public static void sendRequest(final HttpUriRequest     request, 
                                     int                RequestType,
                                     ResponseListener   callback    ) {
    (new AsynchronousSender(new DefaultHttpClient(), request, RequestType, 
                            new Handler(), new CallbackWrapper(callback))).start();
}

}

...

public class AsynchronousSender extends Thread { 
private DefaultHttpClient httpClient; 
private HttpUriRequest    request;
private Handler           handler;
private CallbackWrapper   wrapper;
private int               requestType;
protected AsynchronousSender( DefaultHttpClient httpClient, HttpUriRequest request,
        int requestType, Handler handler, CallbackWrapper wrapper ) {
    setRequest      (request);
    setHandler      (handler);
    setWrapper      (wrapper);
    setClient       (httpClient);
    setRequestType  (requestType);
}

public void run() {
    try {
        final HttpResponse response;
        final HttpParams httpParams = getClient().getParams();  
        HttpConnectionParams.setConnectionTimeout  ( httpParams, 5000 );
        HttpConnectionParams.setSoTimeout          ( httpParams, 5000 );
        Log.d("Ehome", "before execute reauest");
        response = getClient().execute( getRequest() );
        Log.d("Ehome", "post execute reauest");
        int status = response.getStatusLine().getStatusCode();
        switch( status ){
            case HttpStatus.SC_OK:
                getWrapper().setResponse(response);
                getWrapper().setRequestType(getRequestType());
                getHandler().post(getWrapper());
                break;
            default:
                break;
        }
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private HttpClient getClient() {
    return httpClient;
}

...

HttpConnectionParams is the class to use:

Example code (as uncompleted as yours :-))

HttpClient httpClient = new DefaultHttpClient();
final HttpParams httpParams = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, 5000);

So you have to do it something like this (without checking your code deeply):

    public class Client {    

        public static void sendRequest(final HttpUriRequest request, 
                                       int RequestType,
                                       ResponseListener callback) {
        HttpClient httpClient = new DefaultHttpClient();
        final HttpParams httpParams = httpClient.getParams();
        HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
        HttpConnectionParams.setSoTimeout(httpParams, 5000);
        (new AsynchronousSender(httpClient, request, RequestType, 
                            new Handler(), new CallbackWrapper(callback))).start();

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM