post :post 导致 Runnable 被添加到消息队列中,
Runnable :表示可以执行的命令。通常用于在不同的线程中运行代码。
run () :开始执行类代码的活动部分。当使用实现 Runnable 的类创建的线程启动时调用此方法。
getView().post(new Runnable() {
@Override
public void run() {
getView().startAnimation(a);
}
});
代码:getView().startAnimation(a);
在你的代码中,
post 导致 Runnable(代码将在不同的线程中运行)添加消息队列。
因此当从messageQueue中获取 startAnimation 时,它将在新线程中触发
[编辑 1]
为什么我们使用新线程而不是 UI 线程(主线程)?
用户界面线程:
应用程序启动时,会自动创建 Ui Thread
它负责将事件分派给适当的小部件,这包括绘图事件。
它也是您与 Android 小部件交互的线程
例如,如果您触摸屏幕上的 a 按钮,UI 线程会将触摸事件分派给小部件,小部件进而设置其按下状态并将无效请求发送到事件队列。UI 线程将请求出列并通知小部件重绘自身。
如果用户按下将执行 longOperation 的按钮会发生什么?
((Button)findViewById(R.id.Button1)).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
final Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
});
用户界面冻结。该程序甚至可能崩溃。
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/