关于AsyncTask.get()

时间:2012-10-30 16:03:38

标签: android android-asynctask progressdialog

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

由于可能没有对请求的响应,我需要设置AsyncTask的超时值。我发现当我只使用.execute()时,程序运行正常,但没有实现超时功能。当我使用.get(1000, TimeUnit.MILLISECONDS)时,程序暂停1秒钟,并且不显示进度对话框。

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

4 个答案:

答案 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阻止主线程返回。 “超时”版本和方法的基本版本都是如此。因此,它不是异步操作。

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

都有一些方法