2

我想使用 AsyncTask 执行服务器登录,并在连接结束前显示进度对话框。

由于请求可能没有响应,我需要为 AsyncTask 设置超时值。我发现当我简单地使用时.execute(),程序运行良好,但没有实现超时功能。当我使用.get(1000, TimeUnit.MILLISECONDS)时,程序会暂停 1 秒,并且不显示任何进度对话框。

任何人都可以告诉我任务是否在.get(1000, TimeUnit.MILLISECONDS)被调用时执行?如果是,为什么没有执行的迹象;如果没有,我该如何实现AsyncTask的这个超时功能?

4

4 回答 4

3

AsyncTask.get() ,如果在主线程(AKA.UI 线程)中将阻塞执行。

您可能需要在单独的线程中调用它。

编辑

Vogella 写了一篇非常棒的文章:AndroidPerformance: Android Threads, Handlers And AsyncTask

从这里获取代码,我做到了,我向你保证它在不阻塞主 UI 线程的情况下工作得很好。

于 2012-10-30T16:05:38.313 回答
0

如果你使用AndroidHttpClient它有很好的预设连接超时。

于 2012-10-30T16:34:02.413 回答
0

我认为您需要在 HttpUrlConnection 对象上设置超时间隔,这将是处理这种情况的更好选择。

于 2012-10-30T16:10:04.690 回答
0

文档中,该get(long timeout, TimeUnit unit)方法将等待指定的持续时间,然后尝试取消任务。我认为所有这一切都会调用cancel()你的AsyncTask,而不是在你的连接上执行任何类型的超时。如果您正在执行某种长时间的下载,您可以检查isCancelled您的循环。但是,如果您只是想给出某种连接超时,那么get不是这样做的。

另请注意,它会get阻塞主线程,直到它返回。“超时”版本和方法的基本版本都是如此。因此,它不是异步操作。

要获得连接超时,您需要在您创建的实际连接上执行此操作,而不是在任务本身上执行。对于 anHttpUrlConnectionHttpClient.

于 2012-10-30T17:07:07.420 回答