我想使用AsyncTask来执行服务器登录,并在连接结束前显示进度对话框。
由于可能没有对请求的响应,我需要设置AsyncTask的超时值。我发现当我只使用.execute()
时,程序运行正常,但没有实现超时功能。当我使用.get(1000, TimeUnit.MILLISECONDS)
时,程序暂停1秒钟,并且不显示进度对话框。
任何人都可以告诉我在调用.get(1000, TimeUnit.MILLISECONDS)
时是否执行了任务?如果是,为什么没有执行的迹象;如果没有,我该如何实现AsyncTask的超时功能?
答案 0 :(得分:3)
AsyncTask.get(),如果在主线程(AKA.UI线程)中将阻止执行。
你可能需要在一个单独的线程中调用它。
修改强>
Vogella撰写了一篇非常好的文章:AndroidPerformance: Android Threads, Handlers And AsyncTask
从这里获取代码,我做了,我向你保证它可以很好地工作而不会阻塞主UI线程。
答案 1 :(得分:0)
我认为你需要在HttpUrlConnection对象上设置超时间隔,这是处理这种情况的更好选择。
答案 2 :(得分:0)
如果您使用AndroidHttpClient
,它会有很好的预设连接超时。
答案 3 :(得分:0)
从documentation开始,get(long timeout, TimeUnit unit)
方法将等待指定的持续时间,然后尝试取消该任务。我认为所有这一切都会在cancel()
上调用AsyncTask
,而不是在您的连接上执行任何类型的超时。如果您正在执行某种长时间下载,则可以在循环中检查isCancelled
。但是,如果您只是尝试提供某种连接超时,则get
不是这样做的。
请注意get
阻止主线程返回。 “超时”版本和方法的基本版本都是如此。因此,它不是异步操作。
要使连接超时,您需要在您创建的实际连接上执行此操作,而不是在任务本身上执行此操作。对HttpUrlConnection
和HttpClient
。