- Message.线程间传递消息
- Handle.发送和处理消息,利用sendMessage()发送消息,handleMessage()处理消息
- MessageQueue.消息队列,用于存放所有message,每个线程只有以一个MessageQueue对象
- Looper.是MessageQueue的管家,发现MessageQueue有消息时将它取出
public class MainActivity extends AppCompatActivity {
private static final int CHANGE_ID=1;
private TextView textView;
private Handler handler = new Handler(){ //创建handle对象
@Override
public void handleMessage(Message msg) { //处理message的逻辑
switch(msg.what){ //根据msg.what对message进行匹配
case CHANGE_ID:
textView.setText("hellllo worlllld");
break;
default:
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.text) ;
Button button = (Button)findViewById(R.id.changeText);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable(){
@Override
public void run() {
Message message = new Message();
message.what = CHANGE_ID;
handler.sendMessage(message);
}
}).start();
}
});
}
}
handler.post(Runnable r)的用法
new Thread(){
@Override
public void run() {
handler.post(new Runnable() {//传入runnable接口
@Override
public void run() {
textView.setText("我是第三个线程的");
}
});
}
}.start();
内部实现流程图:
阅读源码的一点认识
1、打开一个应用,会在ActivityThread中执行Loop.prepareMainLooper()–(创建Loop对象)和Loop.loop()方法—(不断去获取消息)
2、通过handler的sendMessage(msg)来发送一条消息
这个方法会调用Handler的enqueueMessage()方法(同时将msg.target=this),将执行MessageQueue的enqueueMessage方法,将这个消息插入到队列中(怎么确保这个msgqueue和loop中的一致呢?handle中有两个对象引用Loop和msgQueue,其中msgQueue=Loop中的msgqueue)
3、然后在上面的Loop.loop()方法中会调用msgqueue的msgqueue.next()方法来获取对应的msg,然后通过msg.target.dispatchMessage(msg)来分发这个msg,在handler中dispatchMessage会调用handlerMessage