获取一次性修复用户位置(通过GPS)的正确控制流程是什么?

时间:2011-05-24 16:05:14

标签: android gps control-flow

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

  1. 用户按下按钮。
  2. 处理程序(包含在主活动代码中)向系统注册GPS位置监听器,设置为尽快更新,启动 ASyncTask ,然后完成
  3. 预执行, ASyncTask 生成ProgressDialog,有效阻止任何其他UI使用。
  4. 对于后台任务, ASyncTask 会等待超时或GPS的位置修复。
  5. 执行后, ASyncTask 会在找到位置时向用户显示一些相关数据,或者如果不是,则在吐司中显示错误。它当然也取消了对听众的注册。
  6. 现在,虽然这有效,但仍有许多缺点。首先,很明显,在发出请求时,会阻止与应用程序进行的所有其他UI交互。目前这还不错,因为该应用程序的主要功能是执行此任务,并且在其工作时没有太多其他事情要做 - 它还会阻止用户发送垃圾邮件按钮。另外,我不确定ASyncTask的执行后阶段是否真的是放置我的位置找到逻辑的地方(它进行互联网调用,这本身可能在ASyncTask中更好?)。但是,我不确定如何传回已经找到位置并且主线程应该做某事的事实。

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

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

1 个答案:

答案 0 :(得分:1)

通常应避免阻止调用和阻止UI。请参阅Reto Meier's take on the subject

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

  

(它会进行互联网通话,这本身可能会在ASyncTask中变得更好?)

当然不应该在主应用程序线程上完成。当位置修复进入时,启动AsyncTask以获取数据。