4

这是场景:

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

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

PS我将“等待”代码放入一个Runnable并在我到达我的AsyncTask之前执行它。它可以工作,例如Thread.sleep(2000)我仍然不确定这是安全的方法。有没有人有任何经验FutureTask

4

2 回答 2

2

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

这是您的决定,但请记住,您正在制造自己的问题。就个人而言,我会放弃这个要求。用户不应仅仅因为警报响起而感到不便。

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

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

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

让服务在更新完成时通知活动,通过某种回调,或者可能是广播意图。保持进度指示器处于活动状态,直到发生这种情况。这仍然会带来一些时间挑战,这就是为什么我会放弃这个要求。

于 2010-02-17T23:22:53.163 回答
0

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

  1. 无需戳数据库,只需绑定到服务并开始等待
  2. 如果您无法绑定到该服务,那么它就没有运行,所以没有必要对它进行猴子 - 只需查询数据库并执行您需要的操作
  3. 当服务启动时,开始等待并处理服务发回的任何反馈。这些可以是临时更新,然后是服务完成的最终指示
于 2010-02-18T01:32:00.243 回答