我已经构建了一个应用程序,它使用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服务的项目。虽然我不认为只要游标不同时查询就会出现这个问题吗?
有没有人有其他想法?
答案 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
)。