代码之家  ›  专栏  ›  技术社区  ›  Andrew

维修被卡住

  •  1
  • Andrew  · 技术社区  · 14 年前

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

    例子:

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

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

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

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

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

    另一个潜在的问题是,如果我的活动管理一个表上的游标,我的IntentService会从同一个表中查询一个游标。当我的IntentService遍历光标中的每一行以查找要发送到web服务的项时,我有这样的实例。尽管我不认为这会是一个问题,只要光标不在同一时间查询?

    有人有其他想法吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   CommonsWare    14 年前

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

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

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

    onHandleIntent() 在你的 IntentService 在后台线程上调用,并且 startService() 总是异步的。

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

    个人 Intents 维护服务 .

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

    这当然没有帮助。

    我应该用什么来同步?信号灯?

    我就用 synchronized(someStaticDataMember) ,但信号量应该可以工作。

    尽管我不认为这会是一个问题,只要光标不在同一时间查询?

    直到 Cursor 被触摸(例如。, moveToFirst() , getCount() ). 之后,只要查询结果集小于1MB,结果就完全在 光标 .

    我在某种程度上同意克里斯托弗的观点:使用一些日志来确切地了解发生了什么,并考虑使其更轻量级一些(例如,用于数据库写入的AsyncTask而不是 维护服务 ).