一、Handler简单使用
public class MainActivity extends AppCompatActivity {
TextView mTxtShowTest;
Button mBtn1, mBtn2, mBtn3;
//1、在主线程中通过匿名内部类创建Handler类对象
private Handler mhandler2 = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//执行的UI操作
mTxtShowTest.setText("匿名内部类方法");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTxtShowTest = (TextView) findViewById(R.id.mTxtShowTest);
mBtn2 = (Button) findViewById(R.id.mBtn2);
mBtn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
// 2、创建所需消息对象
Message msg = Message.obtain();
msg.what = 1;
//3、发送消息
mhandler2.sendMessage(msg);
}
//4、开启线程
}).start();
}
});
}
}
二、源码中的执行过程
handler执行流程.pngHandler的主要函数
Handler的主要函数.png
MessageQueue的执行过程
enqueueMessage方法
消息队列.png
这个就是消息队列 取数据,执行这个动作的对象是Looper
loop()
Looper.png
Message 通过 traget,执行dispatchMessage 传递消息
而Message 通过 traget就是与之对应的Handler
Message构造函数.png
于是整个调用流程就是:
handler->sendMessage -> messasgeQueue.enqueueMessage
looper.loop()-> messasgeQueue.next()->handler.dispatchMessage()->handler.handleMessage()
网友评论