IntentService被楔入

时间:2010-10-06 18:47:30

标签: android service android-intent

我已经构建了一个应用程序,它使用IntentService来操作应用程序的数据库并调用Web服务。

示例:

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

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

据我了解,传递给IntentServices的Intent不会异步处理。那是对的吗?它的行为几乎就像我需要使用信号量一样,但是我无法理解为什么Intent会被排队并单独处理。

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

^我认为这是我的问题。我该怎么用来同步这个?信号灯?有人能指点我一些文档/例子吗?

另一个潜在的问题是如果我的Activity管理表上的Cursor;我的IntentService也从同一个表中查询Cursor。我有实例发生这种情况,因为我的IntentService遍历Cursor中的每一行,以查找要发送到Web服务的项目。虽然我不认为只要游标不同时查询就会出现这个问题吗?

有没有人有其他想法?

1 个答案:

答案 0 :(得分:1)

  

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

这有一个“使用别克拍苍蝇”的感觉。

  

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

您的onHandleIntent()中的

IntentService在后​​台线程上调用,而startService()始终是异步的。

  

它的行为几乎就像我需要使用信号量一样,但我无法理解为什么Intent会被排队并单独处理。

Intents个人IntentService排队并按顺序处理。

  

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

这肯定没有帮助。

  

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

我只使用synchronized(someStaticDataMember),但信号量应该有效。

  

虽然我不认为只要游标不同时查询就会出现问题?

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

我同意Christopher:使用一些日志记录来确切地知道发生了什么,并考虑使其更轻量级(例如,数据库写入的AsyncTask而不是IntentService)。