Autore Topic: Service o thread  (Letto 1111 volte)

Offline ginoz

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows
Service o thread
« il: 13 Marzo 2011, 16:12:34 CET »
0
Prima di mettermi a scrivere il codice volevo aver chiaro il disegno generale da implementare e su chiesto chuiedo il vostro aiuto :-)

Allora io ho un'applicazione con 2 activity ed entrambe hanno una voce nel menù che fa partire un download di dati da internet se richiesto dall'utente. Inoltre devo implementare una funzione che ogni x secondi fa il download anche se non direttamente richiesto dall'utente.

Io pensavo a un bound service che fa il download attivato o dalle activity o da un altro service ogni x secondi. E' corretto?

Oppure più semplicemente posso mettere il download in un thread separato senza usare servizi? Come si fa a impedire richieste multiple, cioè che il download sia richiesto sia da una activity che dalla funzione "a tempo"?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Service o thread
« Risposta #1 il: 14 Marzo 2011, 10:17:45 CET »
0
Iniziamo dall'inizio: non puoi paragonare service e thread perché sono due cose totalmente distinte.

Mi spiego meglio direttamente con un esempio pratico: supponiamo che tu decida di usare il service: in ogni caso, dentro il service, devi creare un nuovo thread! Ecco perché l'uno non è alternativa dell'altro.

Per quello che devi fare tu, secondo me, va benissimo un service locale (quindi senza bind, non ne vedo il motivo). Per impedire download multipli, ti basta implementare una variabile membro booleana all'inizio del download ed alla fine...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Service o thread
« Risposta #2 il: 14 Marzo 2011, 10:38:06 CET »
0
Oppure dentro ci metti una bella LinkedBlockingQueue che ti da fa coda bloccante per i download, in modo da farne uno alla volta inpendentemente da quanti se ne accodano.
Ogni volta che se ne accoda uno verifichi se è già in coda o meno e gestisci la cosa di conseguenza.

Offline ginoz

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows
Re:Service o thread
« Risposta #3 il: 14 Marzo 2011, 16:23:26 CET »
0
Il dubbio tra thread e service nasceva dal fatto che nella pagina dei service nella guida android c'è un paragrafo "Should you use a service or a thread?" che mi aveva fatto venire il dubbio :-)

Mi sto leggendo un po' di documentazione sui service e piano piano sto iniziando a capirci qualcosa, ora mi faccio le api demos sui servizi. Pensavo a una bound perché deve ritornare un risultato, o meglio deve rilanciare un requery della activity in primo piano.

Allora pensavo di fare così, un foreground service lanciato all'inizio della applicazione che scarica ogni x secondi (questo non so ancora come si fa ma me lo vedo in seguito :D) anche se si esce dall'applicazione. L'activity può interagire con il service chiedendo il download, il service a questo punto controlla se lo sta già eseguendo altrimenti lo esegue riazzerando il contatore. Alla fine manda la risposta di come è andato il download all'activity in primo piano e ne fa fare il requery.

Il 90% di queste cose non ho idea di come si fanno ma conto di capirlo, come teoria va bene?

Offline ginoz

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows
Re:Service o thread
« Risposta #4 il: 23 Marzo 2011, 10:59:53 CET »
0
Alla fine ho fatto così.

Activity principale:
- onCreate avvia il servizio
- alla pressione del menu Update fa il bind al servizio e ne fa partire il metodo di update
- c'è un broadcast receiver che riceve l'esito dal servizio,  fa partire il requery e fa l'unbind.

Service:
- ogni x secondi fa partire il metodo di update
- se il metodo update viene fatto partire da una activity invece che automaticamente il timer viene cancellato e ricreato per attendere di nuovo x secondi
- all'esecuzione del metodo di update invia un broadcast con l'esito dell'update

Pare funzionare tutto :-)

Offline ginoz

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    windows
Re:Service o thread
« Risposta #5 il: 05 Aprile 2011, 00:30:25 CEST »
0
Oppure dentro ci metti una bella LinkedBlockingQueue che ti da fa coda bloccante per i download, in modo da farne uno alla volta inpendentemente da quanti se ne accodano.
Ogni volta che se ne accoda uno verifichi se è già in coda o meno e gestisci la cosa di conseguenza.

Mi sono messo a vedere un po' di documentazione di LinkedBlockingQueue ma ci ho capito poco  :-\

Allora nel servizio dichiaro
Codice (Java): [Seleziona]
BlockingQueue queue = new LinkedBlockingQueue();
Poi quando ho bisogno di un nuovo dawnload inserisco i dati in una ContentValues e la metto in coda

Codice (Java): [Seleziona]
        ContentValues value = new ContentValues();
        value.put("type", 1);
        value.put("action", "add");
        value.put("mid", 500);          
       
                try {
                        queue.put(value);
                } catch (InterruptedException e) {
                e.printStackTrace();
              }

E il metodo take invece dove lo metto? Non ho chiaro come funziona l'uscita dalla coda.