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.

È stato utile?

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 IntentServiceLa 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 :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top