2010-04-13 14 views
27

Quali sono i vantaggi/svantaggi nell'inserire un codice di accesso di rete lungo in una discussione in un'attività o in una discussione in un servizio? Come influenzerebbe l'applicazione? Sto scrivendo un lettore audio in streaming e da quello che ho letto fino ad ora mettendo il codice in un servizio finirà comunque per bloccare l'applicazione, quindi è necessario un nuovo thread, qualcuno sa se ha più senso inserire questo pezzo di codice in un servizio.Thread di applicazioni vs thread di servizio

risposta

35

Sì, un'operazione di blocco in un servizio bloccherà comunque l'applicazione. Nonostante le prime apparenze, i servizi non sono semplicemente per eseguire attività in background. Sono per l'esecuzione di attività con un ciclo di vita indipendente dal ciclo di vita dell'Attività (IE, possono continuare dopo la chiusura dell'attività).

Un servizio che inizia quando un'attività inizia e termina quando l'attività è terminata è inutile.

Nel tuo caso, quando stai trasmettendo audio, potresti voler trasmettere l'audio anche dopo che l'utente ha chiuso l'Attività, nel qual caso dovresti usare un Servizio, ma avrai comunque bisogno di un thread (o di un AsyncTask) per bloccare le attività.

+0

Grazie, è quello che pensavo. Su un argomento correlato, almeno nell'emulatore, dopo aver avviato lo streaming player, continuerebbe a giocare anche dopo aver premuto il pulsante Indietro. Supponevo che si fermasse quando l'attività non era più in primo piano ... è a causa del nuovo thread o giocherà indipendentemente finché Android non uccide l'applicazione. – zerayaqob

+0

Sì, il thread rimarrà in esecuzione fino a quando Android non lo uccide. Se vuoi che si fermi, implementa una sorta di flag "attivo" e impostalo su false nel tuo metodo onDestroy(). – synic

+3

Si noti inoltre che i thread in un 'Activity' vengono distrutti quando la configurazione (leggi: orientamento) cambia! Questo non è vero per i thread in 'Service' s. – MrSnowflake

1

Dalla mia esperienza (1+ anni di sviluppo di Android), non c'è differenza tra l'esecuzione di un nuovo thread in un servizio o un'attività. Cerca di non mantenere un riferimento all'attività nel nuovo thread - usa il contesto dell'applicazione.

Inoltre, il ciclo di vita del servizio non ha aiutato affatto perché alcuni metodi non sono garantiti ad essere invocate :(

L'unica differenza potrebbe essere che il servizio può essere distrutta senza distruggere completamente l'applicazione - in tal modo potenzialmente distruggere le nuove discussioni perché potenzialmente perché sul lato pratico, questo non accade l'applicazione SEMPRE viene ucciso senza uccidere il servizio prima che, il che significa:.?. il meccanismo di servizio locale è inutile !! !

Il servizio remoto è una discussione diversa: mi riferivo solo a "dove dovrei eseguire un nuovo thread?".

Buona fortuna !!!

+0

Puoi fornire una situazione in cui dovresti eseguire un nuovo thread in un servizio anziché eseguire semplicemente un nuovo thread in un'attività per eseguire la stessa attività? – committedandroider

+0

@committedandroider Di ', hai un'app browser e l'utente seleziona per scaricare un file da 1 GB. L'utente non manterrà aperta l'app del browser e attenderà il download del file. Avvierà semplicemente il download e uscirà dall'app.In questo caso, se il thread generato da Activity non verrà più eseguito, sarà quindi necessario generare un thread dal servizio. – CopsOnRoad

+0

@Jack sì che ha senso. questo è stato tanto tempo fa lol – committedandroider