2

我正在寻找“正确”的方法来修复用户的位置作为一次性任务。目前,我的执行流程大致是:

  1. 用户按下按钮。
  2. 处理程序(包含在主Activity代码中)向系统注册 GPS 位置侦听器,设置为尽快更新,启动ASyncTask并完成。
  3. 执行前,ASyncTask生成一个 ProgressDialog,有效地阻止任何其他 UI 使用。
  4. 对于它的后台任务,ASyncTask等待超时或 GPS 定位。
  5. 执行后,如果找到位置,ASyncTask要么向用户显示一些相关数据,否则在 toast 中显示错误。当然,它也会注销监听器。

现在,虽然这有效,但也有许多缺点。首先,很明显,在发出请求时,与应用程序的所有其他 UI 交互都会被阻止。目前这还不算太糟糕,因为应用程序的主要功能是执行此任务,并且在它工作时没有太多其他事情可做 - 它还可以阻止用户向按钮发送垃圾邮件。此外,我不确定 ASyncTask 的执行后阶段是否真的是放置我的位置发现逻辑的地方(它会拨打互联网电话,这本身在 ASyncTask 中可能会更好?)。但是,我不确定如何将已找到位置以及主线程应该做某事的事实传回。

我希望有人能告诉我这样做的“正确”方法 - 即使用这样的 ASyncTask 是正确的,是否涉及服务,以及我应该如何处理找到的互联网呼叫后定位),甚至可能给出一些明智的话,说明一般如何处理必须进行某种“阻塞”调用的应用程序的控制流。

如果需要,我可以提供代码,可能需要一些时间才能将其缩减为最低限度的解决方案。

4

1 回答 1

1

通常要避免阻塞调用和阻塞 UI。请参阅Reto Meier 对此主题的看法

因此,我会AsyncTask完全抛弃。禁用Button用户用来启动修复请求的选项。使用 apostDelayed() Runnable作为超时机制。并且,允许用户做某事(阅读帮助等)。使用标题栏中的进度指示器指示您正在获取位置,当您获得修复或发生超时时关闭指示器。

(它拨打互联网电话,这本身在 ASyncTask 中可能会更好?)

它当然不应该在主应用程序线程上完成。当位置修复出现时,开始AsyncTask获取数据。

于 2011-05-24T18:07:42.300 回答