Android IntentService被楔入

Android IntentService被楔入,android,service,android-intent,Android,Service,Android Intent,我构建了一个应用程序,它使用IntentService来操作应用程序的数据库和调用web服务 例如: 我有一个活动,它是一个项目列表。此列表由游标适配器填充。每个项目都有一个复选框,列表按选中项排序(顶部为未选中项,底部为已选中项)。选中项目的复选框后,我会向我的IntentService发送一个意图,告诉它在数据库表中标记该项目的选中列,然后广播一条消息,活动会看到它并重新查询光标 当我使用移动设备并开始快速检查复选框时,应用程序基本上挂起。UI不会挂起,但后台的IntentService会挂

我构建了一个应用程序,它使用IntentService来操作应用程序的数据库和调用web服务

例如:

我有一个活动,它是一个项目列表。此列表由游标适配器填充。每个项目都有一个复选框,列表按选中项排序(顶部为未选中项,底部为已选中项)。选中项目的复选框后,我会向我的IntentService发送一个意图,告诉它在数据库表中标记该项目的选中列,然后广播一条消息,活动会看到它并重新查询光标

当我使用移动设备并开始快速检查复选框时,应用程序基本上挂起。UI不会挂起,但后台的IntentService会挂起。我能看出来,因为屏幕上的光标没有刷新

我的理解是,传递给IntentServices的意图不是异步处理的。对吗?它的行为就像我需要使用信号量一样,但我不明白为什么意图是单独排队和处理的

假设我选中3个复选框;因此,有3个意图排队。在第一次之后,我广播了一条消息,活动收到该消息,告诉它重新查询光标。潜在的问题可能是因为我在处理第二个意图(更新表中的另一行)的同时重新查询光标?查询光标发生在UI线程上。

^我想这是我的问题。我应该使用什么来同步此操作?信号灯?有人能给我指一些文档/例子吗

另一个潜在的问题是,如果我的活动管理一个表上的游标,该怎么办;此外,我的IntentService从同一个表中查询游标。在我的IntentService遍历游标中的每一行以查找要发送到web服务的项目时,会发生这种情况。虽然我不认为这会是一个问题,只要游标不在同一时间查询

有人有其他想法吗

选中项目的复选框后,我会向我的IntentService发送一个意图,告诉它在数据库表中标记该项目的选中列,然后广播一条消息,活动会看到它并重新查询光标

这有一种“用别克打苍蝇”的感觉

我的理解是,传递给IntentServices的意图不是异步处理的。对吗

在后台线程上调用
IntentService
中的
onHandleIntent()
,并且
startService()
始终是异步的

它的行为就像我需要使用信号量一样,但我不明白为什么意图是单独排队和处理的

个人
意向
意向服务
排队并按顺序处理

潜在的问题可能是因为我在处理第二个意图(更新表中的另一行)的同时重新查询光标

这当然没有帮助

我应该使用什么来同步此操作?信号灯

我只想使用
synchronized(someStaticDataMember)
,但信号量应该可以工作

虽然我不认为这会是一个问题,只要游标不在同一时间查询

在触摸
光标
之前,不会执行实际查询(例如,
moveToFirst()
getCount()
)。之后,只要查询结果集小于1MB,结果就完全在
光标中

我部分同意克里斯托弗:使用一些日志记录来准确地理解正在发生的事情,并考虑使这一点稍微轻一点(例如,数据库的异步任务,而不是<代码>智能服务< /代码>)。 选中项目的复选框后,我会向我的IntentService发送一个意图,告诉它在数据库表中标记该项目的选中列,然后广播一条消息,活动会看到它并重新查询光标

这有一种“用别克打苍蝇”的感觉

我的理解是,传递给IntentServices的意图不是异步处理的。对吗

在后台线程上调用
IntentService
中的
onHandleIntent()
,并且
startService()
始终是异步的

它的行为就像我需要使用信号量一样,但我不明白为什么意图是单独排队和处理的

个人
意向
意向服务
排队并按顺序处理

潜在的问题可能是因为我在处理第二个意图(更新表中的另一行)的同时重新查询光标

这当然没有帮助

我应该使用什么来同步此操作?信号灯

我只想使用
synchronized(someStaticDataMember)
,但信号量应该可以工作

虽然我不认为这会是一个问题,只要游标不在同一时间查询

在触摸
光标
之前,不会执行实际查询(例如,
moveToFirst()
getCount()
)。之后,只要查询结果集小于1MB,结果就完全在
光标中


我同意克里斯托弗的观点:使用一些日志记录来弄清到底发生了什么,并考虑使这一点稍微轻一点(例如,数据库的异步任务,而不是<代码>国际服务< /代码>)。

一些快速的想法:我会将日志添加到系统的每个部分,以真正找到拥塞所在。DB访问层是ContentProvider吗(它们不是设计为多线程的)?另外,当活动中的处理程序可以执行此操作时,为什么要使用IntentService?类似地,如果活动正在查询主线程上的数据库,为什么还要担心异步发布更新呢