Chiedere un servizio intenst per informazioni sulla sua coda
-
27-10-2019 - |
Domanda
Ho un servizio intenzionale che mette in coda le chiamate di servizio Web che devono essere effettuate sul mio server web. Quindi ogni intento è una chiamata di servizio web da effettuare.
Vorrei impostare qualcosa in cui la mia applicazione può chiedere a questo intenstervice se ha intenti contenenti un particolare pezzo di dati (cioè: "Stai già aspettando di chiedere al cloud i dati X? O devo dirtelo fallo?").
Ci sono suggerimenti su come potrei estendersi intenstervice a farlo? Si può attraversare la coda di intenti di un intenstervice? O avrei bisogno di prendere il codice intenstervice e modificarlo?
L'unica altra idea che ho è quella di aggiungere una tabella al database e al registro quali le chiamate sono in coda, con ogni registro rimosso dalla tabella una volta completato.
Soluzione
Ci sono suggerimenti su come potrei estendersi intenstervice a farlo? Si può attraversare la coda di intenti di un intenstervice? O avrei bisogno di prendere il codice intenstervice e modificarlo?
Probabilmente quest'ultimo, se vuoi davvero esaminare la coda reale. IntentService
gira il Intents
in messaggi saltati sulla coda dei messaggi di a Looper
via a HandlerThread
. Niente di tutto ciò è esposto attraverso l'SDK, però. Per fortuna, IntentService
è abbastanza breve - nemmeno 150 righe. Potresti clonarlo nel tuo pacchetto e apportare modifiche secondo necessità. Basta eseguire un diff sulla fonte quando vengono rilasciati nuovi aggiornamenti di origine nel repository aosp, quindi sai se Google ha eseguito un intervento chirurgico importante su IntentService
stesso di cui potresti voler approfittare.
L'unica altra idea che ho è quella di aggiungere una tabella al database e al registro quali le chiamate sono in coda, con ogni registro rimosso dalla tabella una volta completato.
Non avrebbe nemmeno bisogno di essere persistenti così, dal momento che IntentService
La propria coda non è persistente. Mantieni la tua coda FIFO in onStartCommand()
, concatenandosi alla superclasse e scoppiando il tuo Intent
fuori dalla coda alla fine di onHandleIntent()
. Questo ha la possibilità di uscire dalla sincronizzazione con la coda principale (ad esempio, vorrai usare finally
Per assicurarti di far scoppiare il lavoro dalla tua coda), ma non dovresti clonare la classe.
Altri suggerimenti
Un'altra soluzione potrebbe essere quella di risolverlo sopravvalutando su OnStartCommand.
Qui è una soluzione fluida in cui ho trovato ispirazione per un problema simile :)