【发布时间】:2010-10-06 18:47:30
【问题描述】:
我已经构建了一个应用程序,它使用 IntentService 来操作应用程序的数据库和调用 Web 服务。
例子:
我有一个 Activity,它是一个项目列表。此列表由 CursorAdapter 填充。每个项目都有一个复选框,列表按选中排序(未选中的项目在顶部,选中的项目在底部)。当一个项目的复选框被选中时,我向我的 IntentService 发送一个 Intent,告诉它在数据库表中为该项目标记选中的列,然后广播一条消息,Activity 看到它并重新查询光标。
当我使用移动设备并开始快速检查复选框时,应用程序基本上会挂起。 UI 不会挂起,但后台的 IntentService 会挂起。我可以判断,因为屏幕上的光标没有刷新。
据我了解,传递给 IntentServices 的 Intent 不会被异步处理。那是对的吗?它的行为几乎就像我需要使用信号量一样,但我不明白为什么要单独排队和处理 Intent。
假设我选中了 3 个复选框;所以有3个意图排队。在第一个之后,我广播了一条消息,Activity 收到了这条消息,告诉它重新查询它的光标。可能是因为我在处理第二个意图(更新表中的另一行)的同时重新查询游标吗?查询游标发生在 UI 线程上。
^ 我认为这是我的问题。我应该用什么来同步这个?信号量?有人可以指点我一些文档/示例吗?
另一个潜在的问题是,如果我的 Activity 管理桌子上的光标;我的 IntentService 也从同一个表中查询游标。我有发生这种情况的实例,因为我的 IntentService 正在遍历光标中的每一行以查找要发送到 Web 服务的项目。尽管只要光标不同时查询,我认为这不会是一个问题?
还有人有其他想法吗?
【问题讨论】:
-
一些快速的想法:我会在系统的每个部分添加日志记录,以真正找到卡纸的位置。数据库访问层是 ContentProvider(它们不是为多线程设计的)吗?另外,为什么要在 Activity 中使用 Handler 时使用 IntentService 呢?同样,如果 Activity 在主线程上查询数据库,为什么还要担心异步发布更新,而不是(比如说)AsyncQueryHandler?
-
是的,我的数据库访问是通过 ContentProvider 进行的。我将研究 AsyncQueryHandler
标签: android service android-intent