【问题标题】:About AsyncTask.get()关于 AsyncTask.get()
【发布时间】:2012-10-30 16:03:38
【问题描述】:

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

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

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

【问题讨论】:

标签: android android-asynctask progressdialog


【解决方案1】:

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

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

编辑

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

从这里获取代码,我这样做了,我向您保证它在不阻塞主 UI 线程的情况下运行良好。

【讨论】:

  • 它会阻塞调用线程,这就是你的 ui 没有更新的原因。如果想要超时,可以使用 Handler 的 postDelayed 来安排超时回调。
  • 但我认为postDelayed是推迟回调而不是执行超时?
  • 对了,这不是解决你的问题吗?尝试使用 AsyncTask + Handler
【解决方案2】:

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

【讨论】:

  • 哇...我多么愚蠢...但我仍然对这个 .get() 函数感到很困惑 }
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    要让您的连接超时,您需要在您创建的实际连接上执行此操作,而不是在任务本身上执行此操作。对于HttpUrlConnectionHttpClient,有多种方法可以做到这一点。

    【讨论】:

    • 我明白了...非常感谢,我会尝试另一种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2012-02-19
    • 2021-10-19
    • 1970-01-01
    • 2015-06-20
    相关资源
    最近更新 更多