post : post fa sì che il Runnable venga aggiunto alla coda dei messaggi,
Runnable: rappresenta un comando che può essere eseguito. Spesso utilizzato per eseguire codice in un thread diverso.
run () : avvia l'esecuzione della parte attiva del codice della classe. Questo metodo viene chiamato quando viene avviato un thread che è stato creato con una classe che implementa Runnable.
getView().post(new Runnable() {
@Override
public void run() {
getView().startAnimation(a);
}
});
codice :getView().startAnimation(a);
nel tuo codice,
post fa sì che il Runnable (il codice verrà eseguito in un thread diverso) per aggiungere la coda dei messaggi.
Quindi startAnimation verrà attivato in un nuovo thread quando viene recuperato da messageQueue
[MODIFICA 1]
Perché usiamo un nuovo thread invece del thread dell'interfaccia utente (thread principale)?
Thread dell'interfaccia utente:
Quando l'applicazione viene avviata, il thread Ui viene creato automaticamente
è incaricato di inviare gli eventi ai widget appropriati e questo include gli eventi di disegno.
È anche il thread con cui interagisci con i widget Android
Ad esempio, se tocchi il pulsante a sullo schermo, il thread dell'interfaccia utente invia l'evento tocco al widget che a sua volta imposta il suo stato premuto e invia una richiesta di annullamento alla coda degli eventi. Il thread dell'interfaccia utente rimuove la richiesta e notifica al widget di ridisegnarsi.
Cosa succede se un utente preme un pulsante che farà longOperation?
((Button)findViewById(R.id.Button1)).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
final Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
});
L'interfaccia utente si blocca. Il programma potrebbe persino bloccarsi.
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
}).start();
}
Infrange la regola di Android che non aggiorna mai l'interfaccia utente direttamente dal thread di lavoro
Android offre diversi modi per accedere al thread dell'interfaccia utente da altri thread.
- Activity.runOnUiThread (Runnable)
- View.post (Runnable)
- View.postDelayed (eseguibile, lungo)
- handler
Come sotto,
View.post (Runnable)
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView.post(new Runnable() {
public void run() {
mImageView.setImageBitmap(b);
}
});
}
}).start();
}
handler
final Handler myHandler = new Handler(Looper.getMainLooper());
(new Thread(new Runnable() {
@Override
public void run() {
final Bitmap b = loadImageFromNetwork();
myHandler.post(new Runnable() {
@Override
public void run() {
mImageView.setImageBitmap(b);
}
});
}
})).start();
}
Per maggiori informazioni
http://android-developers.blogspot.com/2009/05/painless-threading.html
http://www.aviyehuda.com/blog/2010/12/20/android-multithreading-in-a-ui-environment/