【问题标题】:Which is the best way to implement timeout for HTTP request in Android?在 Android 中实现 HTTP 请求超时的最佳方法是什么?
【发布时间】:2011-03-12 15:05:15
【问题描述】:

这是我的样本!

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

...在那里我创建了我的 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;
}

...

【问题讨论】:

    标签: java android apache http


    【解决方案1】:

    HttpConnectionParams 是要使用的类:

    示例代码(与您的一样未完成:-))

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

    所以你必须这样做(无需深入检查你的代码):

        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();
    

    }

    【讨论】:

    • 对不起,我已经改进了我的示例。
    • 我看不懂你的代码!相关部分是您创建 httpClient 的位置。在此客户端上,您可以更改 HttpParams。那应该行得通。如果您显示此代码(也许是您的getClient),我也许可以帮助您。
    • 我创建了客户端,然后运行我执行请求的线程!
    • 我没有看到我的代码和你的代码之间的区别(除了深度级别)它应该在这两种情况下都可以工作,但我还是检查了它,它没有工作。 =(你知道有什么新方法吗?
    • 我不知道其他方法。我这样做,它的工作原理。您是否检查了 5000 毫秒是否足以避免超时?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2018-10-25
    • 1970-01-01
    • 2013-10-05
    • 2021-08-04
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多