安卓响应超时

3

你好,我的应用程序向服务器请求一些数据,当应用程序接收到结果之前,应用程序会向用户显示对话框,但在某些情况下,应用程序没有接收到任何响应,也没有超时发生,对话框将永远停留在屏幕上。

以下是HttpClient的代码:

    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);  
    HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);  
    HttpProtocolParams.setUseExpectContinue(params, true);  
     // Turn off stale checking. Our connections break all the time anyway,
    // and it's not worth it to pay the penalty of checking every time.
    HttpConnectionParams.setStaleCheckingEnabled(params, false);

    // Default connection and socket timeout of 30 seconds. Tweak to taste.
    HttpConnectionParams.setConnectionTimeout(params, 5*1000);
    HttpConnectionParams.setSoTimeout(params, 30*1000);
    HttpConnectionParams.setSocketBufferSize(params, 8192);

    ConnManagerParams.setTimeout(params, 5 * 1000);
    ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRouteBean(50));
    ConnManagerParams.setMaxTotalConnections(params, 200);

    // Sets up the http part of the service.
    final SchemeRegistry supportedSchemes = new SchemeRegistry();

    // Register the "http" protocol scheme, it is required
    // by the default operator to look up socket factories.
    final SocketFactory sf = PlainSocketFactory.getSocketFactory();
    supportedSchemes.register(new Scheme("http", sf, 80));
    supportedSchemes.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));  
    final ThreadSafeClientConnManager ccm = new ThreadSafeClientConnManager(params,
            supportedSchemes);

    DefaultHttpClient httpClient = new DefaultHttpClient(ccm, params);`

如果有错误,请指明错误或其他代码建议。

3个回答

1

看起来你正在使得超时操作变得过于复杂。尝试按照以下方式进行:

//TimeOut is set to 20 seconds
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 20000);
HttpConnectionParams.setSoTimeout(httpParams, 20000);
HttpClient client = new DefaultHttpClient(httpParams);

谢谢你之前的回复,我已经尝试了同样的方法但不起作用。 - ronak.mohan

1

建议:

当对话框显示时,需要发送延迟消息到处理程序,当接收到延迟消息时,关闭对话框并取消请求。

Hanlder.sendEmptyMessageDelayed(what,delay_time)

使用HttpUriRequest.abort取消请求。

延迟时间可以假定为超时或者您认为的最长时间。


谢谢您的回复,但我正在使用异步任务来发送数据。您能否建议我其他的方法来完成相同的任务? - ronak.mohan
好的,sendEmptyMessageDelayed在任务开始之前被调用,你也可以在任何地方执行它,所以如果你想在异步任务中执行它,只需传递一个handler引用即可。 - idiottiger
你能否提供一些例子或更详细地解释一下,来鼓励它? - ronak.mohan

0

我在一个项目中遇到了同样的问题。

HttpConnectionParams.setConnectionTimeout(httpParams, 20000);
HttpConnectionParams.setSoTimeout(httpParams, 20000);

但我不知道为什么上面的代码片段有时会出现问题。超时会发生,但在我的情况下不是在20秒内。

所以我想出了一个小技巧。我知道这不被推荐,但你可能会发现它有用。 你将有3种情况可以解除对话框并继续。

1)一旦收到响应就解除对话框。

2)如果超时,则解除对话框。

3)编写一个逻辑,在handler.post dealyed中解除对话框。确保您始终将延迟指定为您在setSoTimeout中给出的时间(不推荐,但有用)。

因此,在最坏的情况下,如果您在指定的超时持续时间内没有收到响应/超时,第三种方法将始终起作用。

希望这有所帮助。


谢谢您的回复。我没有使用处理程序,而是在整个应用程序中使用带有回调监听器的异步任务。我的回调监听器无法通知活动。请给我一些其他的建议。 - ronak.mohan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接