post :post により、Runnable がメッセージ キューに追加されます。
Runnable :実行可能なコマンドを表します。多くの場合、別のスレッドでコードを実行するために使用されます。
run () : クラスのコードのアクティブな部分の実行を開始します。このメソッドは、Runnable を実装するクラスで作成されたスレッドが開始されたときに呼び出されます。
getView().post(new Runnable() {
@Override
public void run() {
getView().startAnimation(a);
}
});
コード:getView().startAnimation(a);
あなたのコードで、
post により、Runnable (コードは別のスレッドで実行されます) がメッセージ キューを追加します。
したがって、startAnimation は、messageQueueからフェッチされるときに新しいスレッドで起動されます。
[編集1]
UI スレッド (メイン スレッド) の代わりに新しいスレッドを使用するのはなぜですか?
UI スレッド:
たとえば、画面上のボタンをタッチすると、UI スレッドがタッチ イベントをウィジェットにディスパッチし、ウィジェットが押された状態を設定して、無効化リクエストをイベント キューにポストします。UI スレッドはリクエストをデキューし、ウィジェット自体を再描画するように通知します。
ユーザーが longOperation を実行するボタンを押すとどうなりますか?
((Button)findViewById(R.id.Button1)).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
final Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
});
UI がフリーズします。プログラムがクラッシュすることさえあります。
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
}).start();
}
これは、 UI をワーカー スレッドから直接更新しないという Android の規則に違反しています。
Android には、他のスレッドから UI スレッドにアクセスする方法がいくつか用意されています。
- Activity.runOnUiThread(実行可能)
- View.post(実行可能)
- View.postDelayed(実行可能、長い)
- ハンドラ
以下のように、
View.post(実行可能)
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();
}
ハンドラ
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();
}

詳細については
http://android-developers.blogspot.com/2009/05/painless-threading.html
http://www.aviyehuda.com/blog/2010/12/20/android-multithreading-in-a-ui-environment/