Android:如何正确等待服务流程完成

时间:2010-02-17 22:18:45

标签: android background notifications updates

这是一个场景:

  1. 我有2项活动和一项服务
  2. 第一项活动是着陆视图/搜索页面。第二个活动显示搜索结果
  3. 始终针对内部SQLite数据库执行搜索
  4. 定期(比如说每天)db需要从远程源更新,这是一个很长的过程
  5. 如果用户在更新期间执行搜索,我想等到更新结束,同时显示“请稍候”进度警报。在刷新完成之前,我不想查询和显示搜索结果。
  6. 数据库更新由AlarmManager触发并由服务执行,该服务在更新过程中将“更新”状态置于数据库中
  7. 我可以轻松查询状态,但如何等待并定期重新查询数据库?我正在使用AsyncTask来处理搜索结果,而我的下意识反应是将wait()放入AsyncTask#doInBackground方法,但这很危险,因为我没有控制UI线程,所以根本不起作用我最终得到IllegalMonitorStateException
  8. 在这种情况下,正确等待的“正确”方式是什么(甚至可能是状态更新)?

    P.S。我将“等待”代码放入Runnable并在我到达AsyncTask之前执行它。它有效,例如Thread.sleep(2000)我还不确定这是安全的方法。有没有人有FutureTask的经验?

2 个答案:

答案 0 :(得分:2)

  

如果用户在执行期间执行搜索   更新我想等到更新   显示“请稍候”时结束   进度警报。我不想查询   并显示搜索结果,直到   刷新完全完成。

这是你的电话,但要记住你正在创造自己的问题。就个人而言,我会抛弃这个要求。用户不应仅仅因为闹钟响起而感到不便。

例如,您可以禁用警报并在活动消失时重新启用警报。

或者,让更新以原子方式执行(例如,对表的副本进行更新,然后在事务中同步表),以便活动仍然可以安全地访问数据库正在进行更新。

  

什么是“正确”的方式   正确等待(甚至可能是状态   更新)在这种情况下?

让服务在更新完成后,通过某种回调或广播Intent告诉活动。保持进度指示器保持活动状态直到发生这仍然会引入一些时序挑战,这就是为什么我只是抛弃了这个要求。

答案 1 :(得分:0)

感谢Mark(一如既往)提供有用的见解。在这里,我将概述(在我看来)应该如何完成上述场景:

  1. 而不是戳数据库只需绑定到服务并开始等待
  2. 如果您无法绑定到该服务,那么它就不会运行,因此无需使用它 - 只需查询数据库并执行您需要的操作
  3. 当服务启动时,开始等待并处理服务发回的任何反馈。这些可以是临时更新,然后是服务完成的最终指标