Se vedi il codice sorgente di Asyntask e Handler, vedrai il loro codice esclusivamente in Java. (Naturalmente, ci sono alcune eccezioni, ma non è un punto importante).
Perché significa? Non significa magia in Asyntask o Handler. Semplicemente rendono il tuo lavoro più semplice come sviluppatore.
Per esempio: se Programa chiama Methoda(), Methoda() verrebbe eseguito in un thread diverso con ProgramA.You può facilmente verificare da:
Thread t = Thread.currentThread();
int id = t.getId();
e perché si dovrebbe usare nuovo thread? Puoi google per questo. Molte molte ragioni.
Quindi, qual è la differenza?
AsyncTask e Handler sono scritti in Java (utilizzano internamente un thread), quindi tutto ciò che si può fare con Handler o AsyncTask, si può ottenere usando anche un Thread.
Con quale Handler e AsyncTask è veramente d'aiuto?
Il motivo più ovvio è la comunicazione tra thread chiamante e thread di lavoro. (Thread chiamante: un thread che chiama il thread worker per eseguire alcune attività. Un thread del chiamante potrebbe non essere il thread dell'interfaccia utente sempre). E, naturalmente, puoi comunicare tra due thread in altri modi, ma ci sono molti svantaggi, ad esempio: il thread principale non è thread-safe (nella maggior parte dei casi), in altre parole, PERICOLOSO.
Ecco perché è necessario utilizzare Handler e AsyncTask. Loro fanno la maggior parte del lavoro per te, hai solo bisogno di sapere quali metodi superare.
Gestione delle differenze e AsyncTask: utilizzare AsyncTask quando il thread del chiamante è un thread dell'interfaccia utente. Questo è ciò che dice il documento Android:
AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers
Voglio sottolineare due punti:
1) Facilità d'uso del thread UI (così, usare quando filo chiamante è UI thread).
2) Non è necessario manipolare i gestori. (significa: puoi usare Handler invece di AsyncTask, ma AsyncTask è un'opzione più semplice).
Ci sono molte cose in questo post che non ho ancora detto, ad esempio: cos'è l'interfaccia utente, del perché è più facile. È necessario conoscere un metodo dietro ogni tipo e utilizzarlo, sarà completamente capire perché ..
@: quando si legge il documento di Android, si vedrà:
Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue
Possono sembrare strano in un primo momento . Basta capire che ogni thread ha ogni coda di messaggi. (come una lista delle cose da fare), e thread prenderà ciascun messaggio e lo farà fino a quando la coda del messaggio emty. (Ah, forse come se finissi il tuo lavoro e vai a letto). Quindi, quando Handler comunica, dà semplicemente un messaggio al thread del chiamante e attenderà l'elaborazione. (sophiscate? ma tu lo sai, Handler può comunicare con thread chiamante in modo sicuro)
Ok quindi l'idea è di delegare compiti che potrebbero richiedere più tempo ad altri thread in modo che il thread principale non sia in attesa di informazioni da altrove mentre potrebbe essere in esecuzione qualcos'altro. Quindi, mentre puoi eseguire tutto da onCreate, probabilmente non è il modo più efficace per farlo. – Rarw
Beh, dipende da come si definisce "efficiente". La migliore pratica suggerisce in genere che se si dispone di qualcosa che richiede una quantità "notevole" di tempo, è necessario spostarlo fuori dal thread dell'interfaccia utente e quindi da onCreate. È anche un po 'condizionale se hai bisogno o meno dei risultati per visualizzare l'interfaccia utente, ecc. Ma sì, il tuo commento è corretto in generale direi. – mfrankli