2011-03-18 62 views
7

我有一个IntentService,它将需要对我的Web服务器进行的Web服务调用进行排队。因此,每个意图都是要进行的Web服务调用。询问IntentService以获取有关其队列的信息

我想设置一些东西,让我的应用程序可以询问这个IntentService,如果它有任何包含特定数据段的Intents(IE:“您是否已经在等待向云请求x数据?还是需要告诉你这么做?“)。

有没有关于如何扩展IntentService的建议? IntentService的Intent队列可以遍历吗?或者我需要采取IntentService代码并改变它?

我唯一的想法是向数据库中添加一个表并记录哪些调用在队列中,每个日志在完成时从表中删除。

回答

19

有没有关于如何扩展IntentService的建议? IntentService的Intent队列可以遍历吗?或者我需要采取IntentService代码并改变它?

可能是后者,如果你真的想检查实际的队列。 IntentService通过HandlerThreadIntents变成弹出在Looper的消息队列中的消息。不过,这些都没有透露过SDK。幸运的是,IntentService相当短 - 甚至没有150线。您可以将其克隆到您自己的包中,并根据需要进行修改。在AOSP存储库中发布新源更新时,只需在源代码上运行差异化,那么您知道Google是否在IntentService本身上执行了任何您可能想要利用的重大手术。

我唯一的想法是向数据库添加一个表并记录哪些调用在队列中,并且每个日志在完成时从表中删除。

它甚至不需要像这样持久化,因为IntentService自己的队列不是持久的。只需维护您自己的FIFO队列onStartCommand(),链接到超类,并在onHandleIntent()末尾弹出您的队列Intent。这有可能会与主队列不同步(例如,您需要使用finally以确保将作品从您的队列中弹出),但您不必克隆该类。

+0

伟大的职位。我想我现在有一些好的想法可供探索。谢谢:) – Andrew 2011-03-19 07:03:25

+1

非常感谢你这篇文章。我实现了这个类的一个版本,用于阻止Intent在队列中运行,但如果需要的话可以轻松调整它。https://gist.github.com/2898452 – SeanPONeil 2012-06-08 22:35:26

+1

感谢您的工作代码。我唯一添加的是添加一个默认的isEqual方法,它使用filterEquals,然后允许我重写它,以便我可以将一些Extras添加到意图中,因为我的所有意图的操作都是相同的。哦,我也叫我的版本UniqueIntentService :) – guyland123 2014-01-29 20:07:32

1

另一种解决方案可能是通过覆盖onStartCommand来解决它。

Here是一个光滑的解决方案,其中我发现灵感了类似的问题:)

+0

但是,当我看得更近,我意识到你发布的问题以及:) – johan 2011-10-26 21:17:07