1. Message
消息
2. Message Queue
消息队列,用来存放通过Handler发送的消息,按照先进先出执行。
3. Handler
Handler是Message的主要处理者,将Message添加到消息队列中以及对消息队列中的Message进行处理(发送和处理消息)。
4. Looper
循环取出Message Queue里面的Message,并对相应的Handler进行处理(主线程创建的时候,Looper就被创建了)。
注意:安卓中的UI更新只能在主线程中操作
handler机制:
子线程不能直接更新UI,拿到主线程handler对象,发送消息,发送消息后,主线程进入messageQueue消息队列里面,由lopper循环从消息队列取消息,拿给handler,handler通过handlerMassage处理消息
Handler的使用步骤:
1.在主线程下创建Handler
2.子线程利用Handler对象发送消息
3.处理消息,在Handler对象中重写handlerMessage方法
下面是具体代码实现:
推荐使用这个:
public class MainActivity extends AppCompatActivity {
Button but;
Message message;
Handler handler = new Handler() {//Handler导包时注意是 os包
@Override
public void handleMessage(Message msg) {//重写handleMessage
super.handleMessage(msg);
if (msg.what == 1) {//判断what和传递的值是否一样
int i= (int) msg.obj;
but.setText(i+"");
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
but = (Button) findViewById(R.id.but);
new Thread() {
@Override
public void run() {
super.run();
for (int i = 3; i > 0; i--) {
try {
sleep(1000);
/**传递信息*/
message = new Message();
message.what = 1;
message.obj = i;
handler.sendMessage(message);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
}
当然Handler还有其他的方法实现:
1.runOnUiThread()
runOnUiThread(new Runnable() {
@Override
public void run() {
but.setText("123456");
}
});
2.new Handler().postDelayed()
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"",Toast.LENGTH_SHORT).show();
}
},3000);