2013-07-30 6 views
6

Perdonare le mie domande, dato che sono ancora molto nuovo alla programmazione, quindi non capisco appieno i concetti di mainthreads, task asincroni, servizi e thread. Sto leggendo la documentazione sui Servizi per Android perché voglio svolgere alcune attività dal thread principale. Dice:Service o Thread o AsyncTask

Se è necessario eseguire lavori fuori della vostra thread principale, ma solo mentre l'utente interagisce con l'applicazione, allora si dovrebbe probabilmente invece creare un nuovo thread e non un servizio.

1.Sono dicendo che un "thread" si interrompe immediatamente dopo aver lasciato l'app (cioè: pulsante Home)?

Ad esempio, se si desidera riprodurre musica, ma solo durante l'attività è in esecuzione, è possibile creare un thread nel onCreate(), avviare correre in onStart(), poi fermarlo in onStop(). Considerare anche l'uso di AsyncTask o HandlerThread, invece della tradizionale classe Thread. Vedere il documento Processi e thread per ulteriori informazioni sui thread .

2. Se i thread sono cotti in Java, perché Android ha AsyncTasks?

Ricordate che se si fa uso di un servizio, che gira ancora nel thread principale dell'applicazione di default, quindi si dovrebbe comunque creare un nuovo discussione all'interno del servizio se ha un rendimento intensiva o il blocco operazioni.

3. Questo significa sostanzialmente che quasi tutti i servizi generano fondamentalmente un thread creato al suo interno?

4. Potrebbe essere negativo avviare un AsyncTask all'interno di un servizio?

risposta

10

1.Are che dire che un "filo" si arresta immediatamente dopo aver lasciato l'applicazione (cioè: tasto Home)?

A Thread deve essere distrutto quando lo Thread che ha avviato viene distrutto. Pertanto, se si avvia un Thread in un Activity, questo andrebbe distrutto quando lo Activity viene distrutto o trasferito su un numero Service. Per esempio, è possibile avviare la musica in un Thread e aggiornare le canzoni lì, ma se si desidera che di continuare a giocare quando il Activity viene distrutto, allora dovrebbe essere spostato ad un Service

2. Se le discussioni sono cotto in Java , perché Android ha AsyncTasks?

Un AsyncTask consente di eseguire il lavoro di fondo e facilmente aggiornare il UI prima, durante e dopo il lavoro di fondo viene fatto utilizzando uno qualsiasi dei suoi metodi built-in eccetto per doInBackground(), perché è l'unico che non assalto alle UI Thread

3.Does questo in sostanza significano, che quasi ogni servizio è fondamentalmente sta per avere un thread creato al suo interno?

Non necessariamente, ma è possibile creare una Thread all'interno di esso

4.Would che sia male per avviare un AsyncTask all'interno di un servizio?

No. Potresti farlo.

AsyncTask è un ottimo modo per eseguire operazioni in background. I suoi metodi rendono molto facile l'aggiornamento di UI. Ma devi leggere attentamente la documentazione (forse anche poche volte) per assicurarti di capire completamente come usarli.Inoltre, ricorda che si tratta di operazioni di breve durata in modo che possano essere utili per il download dei dati di rete, ma non dovrebbero essere utilizzate per cose che durano più di pochi secondi (Secondo i documenti)

+2

Completo! buon lavoro. +1 –

+1

pulito e ordinato. – Raghunandan

5
  1. Una discussione non si interrompe immediatamente quando si esce dall'app. Il suggerimento di utilizzare un thread separato è solo per non bloccare la GUI dell'app.

  2. AsyncTasks utilizza effettivamente un ThreadPool dietro le quinte poiché la creazione di un thread è un processo costoso. Se hai molte attività di breve durata, usare AsyncTask è solo un modo rapido, facile ma efficace per eseguirle senza bloccare la GUI dell'applicazione.

  3. Sì, in sostanza. Tuttavia, un servizio è più pesante di un filo. Utilizzare un servizio al posto di una discussione non è una buona idea. Inoltre, i servizi possono essere effettivamente eseguiti per l'esecuzione su un intero altro processo. Solo FYI.

  4. No. Sarebbe una buona idea, se hai molte attività di breve durata da eseguire.

Se si sta tentando di eseguire solo le attività dal thread principale, non è necessario un servizio. Basta creare un altro thread.

AsyncTask dietro le quinte sottopone l'attività a un pool di thread per l'esecuzione. Se hai molte attività di breve durata, come l'analisi del traffico di rete, lo AsyncTask è fantastico.

Tuttavia, se si sta gestendo un'enorme quantità di richieste, è possibile che si desideri un maggiore controllo sul pool di thread che esegue le attività.

+0

dovresti aver specificato che asynctasks è usato per fare sollevamento pesi! Questo è uno degli scopi principali che un asynctask ha – Dante

+3

No, devi solo fare networking su un thread non-gui. Poiché il task Async viene eseguito su un thread non-gui, * può * essere usato, ma non è l'unica soluzione. @Dante No, 'AsyncTask' non è necessariamente per il sollevamento di carichi pesanti. –

+0

@Keyser dipende dalla quantità di controllo necessaria per il threadpool. Un 'AsyncTask' è solo un modo rapido per accedere a un threadpool. Se vuoi scrivere un'app che gestisce un'enorme quantità di traffico, userei qualcosa di diverso da "AsyncTask" per il controllo sull'ottimizzazione delle prestazioni. –

1
  1. No

  2. Perché un thread principale controlla l'interfaccia utente, mentre asynctasks possono fare i compiti più pesanti, mantenendo l'interfaccia utente lag-libera.

  3. No, ma se si desidera che il servizio esegua operazioni di sollevamento di carichi pesanti come caricamento da Internet, è necessario utilizzare un asynctask. La maggior parte dei servizi viene utilizzata per caricare dati da Internet, quindi molti di loro hanno asincronizzazione. Si noti che per mantenere il servizio in vita dopo la morte dell'attività, è necessario specificarlo. Servizi per impostazione predefinita morire insieme con l'attività a meno che non configurato correttamente

  4. No

+3

I thread non si fermano immediatamente quando si esce dall'app. –

+0

il mio male, appena ricontrollato sulla mia app: P – Dante

+1

Tu e io siamo d'accordo, non c'è motivo di discutere qui. Bel lavoro +1 –

0

Potresti essere confuso da thread e task e process.Task è un piccolo tipo di processo.Il processo è un programma che nell'esecuzione nell'esempio di sistema quando si avvia il task manager mostra tutto il processo in esecuzione come Internet-explorer ma il thread è un processo leggero di piccole dimensioni significa che puoi dire sottoprocesso che in esecuzione per l'esecuzione di qualche compito ma asincrono in Android è simile al thread ma potrebbe essere lungo.Fai un esempio in Android stai giocando a tempio in Android-phone, e qualcuno ti sta chiamando in modo che l'attività ad alta priorità venga eseguita e il thread corrente è in pausa lì e così tanti metodi ci sono come onCreate(), onPause(), puoi capirlo.