我已经构建了一个使用IntentService的应用程序,该应用程序用于处理应用程序的数据库和调用Web服务。

例:

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

当我使用移动设备并开始快速检查复选框时,该应用程序实际上已挂起。 UI不会挂起,但后台的IntentService会挂起。我可以说是因为屏幕上的游标没有刷新。

据我了解,传递给IntentServices的Intent不是异步处理的。那是对的吗?它的行为几乎就像我需要使用信号量一样,但是我不明白为什么如果将Intent分别排队和处理。

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

^我认为这是我的问题。我应该使用什么来同步它?信号量?有人可以指出一些文档/示例吗?

另一个潜在的问题是,如果我的活动在桌子上管理一个游标,该怎么办?我的IntentService也在同一张表中查询Cursor。在我的IntentService遍历Cursor中的每一行以查找要发送到Web服务的项目时,我会遇到这种情况。尽管只要游标不同时查询,我认为这不会成为问题?

还有其他想法吗?

最佳答案

选中一个项目的复选框后,我向IntentService发送一个Intent,告诉它在数据库表中为该项目标记选中的列,然后广播一条消息,Activity看到它并重新查询Cursor。


这具有“用别克拍打苍蝇”的感觉。


  据我了解,传递给IntentServices的Intent不是异步处理的。那是对的吗?


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


  它的行为几乎就像我需要使用信号量一样,但是我不明白为什么如果将Intent分别排队和处理。


各个IntentsIntentService依次排队并进行处理。


  可能是因为我在处理第二个Intent的同时重新查询Cursor(更新表中的另一行)?


这当然无济于事。


  我应该使用什么来同步它?信号量?


我只使用synchronized(someStaticDataMember),但是信号灯应该可以工作。


  尽管只要游标不同时查询,我认为这不会成为问题?


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

我在某种程度上同意Christopher的观点:使用一些日志记录来准确地了解正在发生的事情,并考虑使其变得更轻量(例如,用于数据库写入的AsyncTask而不是IntentService)。

关于android - IntentService陷入困境,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3875880/

10-11 10:38