2011-03-18 59 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