Einen IntentService nach Informationen zu seiner Warteschlange fragen

7

Ich habe einen IntentService, der Webservice-Aufrufe in die Warteschlange stellt, die an meinen Webserver gesendet werden müssen. So ist jeder Intent ein Webservice-Aufruf, der gemacht werden muss.

Ich möchte etwas einrichten, wo meine Anwendung diesen IntentService fragen kann, wenn sie Intents enthält, die ein bestimmtes Datenelement enthalten (IE: "Warten Sie schon darauf, die Cloud nach x-Daten zu fragen? Oder muss ich das tun? sag es dir, es zu tun? ").

Gibt es irgendwelche Vorschläge, wie ich IntentService dazu erweitern könnte? Kann die Intent-Queue eines IntentService durchlaufen werden? Oder müsste ich den IntentService-Code nehmen und ändern?

Die einzige andere Idee, die ich habe, besteht darin, der Datenbank eine Tabelle hinzuzufügen und zu protokollieren, welche Aufrufe in der Warteschlange sind, wobei jedes Protokoll nach Beendigung aus der Tabelle entfernt wird.

    
Andrew 18.03.2011, 19:39
quelle

2 Antworten

19
  

Gibt es irgendwelche Vorschläge, wie ich IntentService dazu erweitern könnte? Kann die Intent-Queue eines IntentService durchlaufen werden? Oder müsste ich den IntentService-Code nehmen und ändern?

Wahrscheinlich letzteres, wenn Sie die aktuelle Warteschlange wirklich untersuchen möchten. IntentService wandelt die Intents in Nachrichten um, die in der Nachrichtenwarteschlange von Looper über eine HandlerThread angezeigt werden. Nichts davon wird jedoch über das SDK bereitgestellt. Glücklicherweise ist IntentService ziemlich kurz - nicht einmal 150 Zeilen. Sie könnten es in Ihr eigenes Paket klonen und nach Bedarf Änderungen vornehmen. Führen Sie einfach ein Diff auf der Quelle aus, wenn neue Quellupdates im AOSP-Repository veröffentlicht werden, damit Sie wissen, ob Google eine größere Operation an IntentService selbst durchgeführt hat, von der Sie möglicherweise profitieren möchten.

  

Die einzige andere Idee, die ich habe, ist, eine Tabelle zur Datenbank hinzuzufügen und zu protokollieren, welche Aufrufe in der Warteschlange sind, wobei jedes Protokoll nach Beendigung aus der Tabelle entfernt wird.

Es müsste nicht einmal so persistent sein, da die eigene Warteschlange von IntentService nicht persistent ist. Behalte einfach deine eigene FIFO-Warteschlange in onStartCommand() , kettet an die Oberklasse und platziere deine Intent aus der Warteschlange am Ende von onHandleIntent() . Dies kann dazu führen, dass die Synchronisierung mit der Masterwarteschlange fehlschlägt (z. B. möchten Sie finally verwenden, um sicherzustellen, dass Sie die Arbeit aus Ihrer eigenen Warteschlange löschen), aber Sie müssen die Klasse nicht klonen.

    
CommonsWare 18.03.2011, 20:18
quelle
1

Eine andere Lösung könnte darin bestehen, es durch Überschreiben von onStartCommand zu lösen.

Hier ist eine glatte Lösung, in der ich Inspiration für ein ähnliches Problem gefunden habe: )

    
johan 26.10.2011 21:16
quelle