sendMessage
阻塞,发送消息后会等到结果的返回,返回一个result.
都是从整个Messge池中返回一个新的Message实例,在许多情况下使用它,能避免分配新的对象,从而减少内存的开销了
。
postMessage
不会阻塞,不等结果的返回,直接返回一个boolean值。
sentToTarget
sentToTarget中也是调用sendMessage,所以跟第一种是一样的。
获取Message的三种方式
Message msg = handler.obtainMessage();
msg.arg1 = i;
msg.sendToTarget();
handler.obtainMessage()实际调用的是message.obtain(this)
Message msg=new Message();
msg.arg1=i;
handler.sendMessage(msg);
Message msg= Message.obtain();
msg.arg1=i;
handler.sendMessage(msg);
UI的刷新
1、handler.sendMessage();
handler.senMessage() + handler.dispatchMessage()
因为在dispatchMessage()的源码中调用了handleMessage()去处理message,所以也可以在dispatchMessage()对message进行一系列的操作。
handler.senMessage() + handler.handleMessage()
2、andler.post();
new Thread(){
@Override
public void run() {
try {
//你的处理逻辑,这里简单睡眠一秒
this.sleep(1000);
//利用obtain
msg = Message.obtain(mainHandler, new Runnable() {
@Override
public void run() {
titleView.setText("sendMsg——Result");
}
});
msg.sendToTarget();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
3、在activity中可以 runOnUiThread();
new Thread(){
@Override
public void run() {
try {
//你的处理逻辑,这里简单睡眠一秒
this.sleep(1000);
runOnUiThread(new Runnable() {
@Override
public void run() {
titleView.setText("runOnUiThread——Result");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
4、在子view中可以 view.post()
new Thread(){
@Override
public void run() {
try {
//你的处理逻辑,这里简单睡眠一秒
this.sleep(1000);
viewPostBtn.post(new Runnable() {
@Override
public void run() {
titleView.setText("viewPost——Result");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
网友评论