post : post powoduje dodanie Runnable do kolejki wiadomości,
Runnable: Reprezentuje polecenie, które można wykonać. Często używany do uruchamiania kodu w innym wątku.
run () : Rozpoczyna wykonywanie aktywnej części kodu klasy. Ta metoda jest wywoływana, gdy uruchamiany jest wątek, który został utworzony za pomocą klasy implementującej Runnable.
getView().post(new Runnable() {
@Override
public void run() {
getView().startAnimation(a);
}
});
kod :getView().startAnimation(a);
w swoim kodzie,
post powoduje, że Runnable ( kod zostanie uruchomiony w innym wątku), aby dodać kolejkę komunikatów.
Więc startAnimation zostanie uruchomiona w nowym wątku, gdy zostanie pobrana z messageQueue
[EDYCJA 1]
Dlaczego używamy nowego wątku zamiast wątku interfejsu użytkownika (wątek główny)?
Wątek interfejsu użytkownika:
Po uruchomieniu aplikacji, wątek Ui jest tworzony automatycznie
odpowiada za wysyłanie wydarzeń do odpowiednich widżetów, w tym za rysowanie.
Jest to również wątek, z którym korzystasz z widżetów Androida
Na przykład, jeśli dotkniesz przycisku a na ekranie, wątek interfejsu użytkownika wysyła zdarzenie dotyku do widżetu, który z kolei ustawia swój stan naciśnięcia i wysyła żądanie unieważnienia do kolejki zdarzeń. Wątek interfejsu użytkownika usuwa z kolejki żądanie i powiadamia widżet o konieczności przerysowania.
Co się stanie, jeśli użytkownik naciśnie przycisk, który będzie działał długo?
((Button)findViewById(R.id.Button1)).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
final Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
});
Interfejs użytkownika zawiesza się. Program może się nawet zawiesić.
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
}).start();
}
Łamie regułę Androida, która nigdy nie aktualizuje interfejsu użytkownika bezpośrednio z wątku roboczego
Android oferuje kilka sposobów uzyskiwania dostępu do wątku interfejsu użytkownika z innych wątków.
- Activity.runOnUiThread (do uruchomienia)
- View.post (Runnable)
- View.postDelayed (Runnable, long)
- Treser
Jak poniżej,
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();
}
Treser
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();
}

Po więcej informacji
http://android-developers.blogspot.com/2009/05/peling-threading.html
http://www.aviyehuda.com/blog/2010/12/20/android-multithreading-in-a-ui-environment/