Handler通信工作原理
Android中为了UI操作线程安全,只允许UI线程更新Activity里的UI组件。
工作线程操作UI的消息传递到主线程,主线程根据工作线程的需求更新UI,保证线程安全。
Handler工作流程解析
1.异步通信准备
在主线程中创建:
处理器对象Looper
消息队列对象Message Queue,Looper则自动进入消息循环,Handler自动绑定主线程的Looper、MessageQueue
Handler对象
2.消息发送
工作线程(子线程)通过Handler发送消息(Message)到消息队列(Message Queue)中。
3.消息循环
消息出队:Looper循环取出Message Queue中的Message;
消息分发:Looper将取出的Message发送创建该Message的处理者Handler;
在消息循环过程中,若消息队列为空,则线程阻塞。
4.消息处理
Handler接收Looper发过来的Message;
Handler根据Message进行UI操作;
注意的知识点
- 一个线程(Thread)只能绑定一个循环器(Looper),但可以有多个处理者(Handler);
- 一个循环器(Looper)可以绑定多个处理者(Handler);
- 一个处理者(Handler)只能绑定一个循环器(Looper);
Handler的两种方式
方式一:Handler.sendMessage()
private static final int UPDATE_TEXT = 1;
//创建Handler函数
private Handler handler = new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case UPDATE_TEXT:
//进行UI更新
break;
default:
break;
}
}
}
创建线程发送消息
new Thread(new Runnable(){
@Override
public void run(){
Message message = new Message();//实例化消息对象
message.what=UPDATE_TEXT;//消息标识
handler.sendMessage(message);//发送message
}
}).start();
方式二:Handler.post()
private Handler handler = new Handler();
new Thread(new Runnable(){
@Override
public void run(){
handler.post(new Runnable(){
@Override
public void run(){
//更新UI逻辑
}
});
}
}).start();
举个栗子
方式一:Handler.sendMessage()
public class MainActivity extends AppCompatActivity{
private static String TAG = "MainActivity";
private static final int UPDATE_TEXT = 1;
private TextView handlerText;
private Button handlerButton;
private Handler handler = new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case UPDATE_TEXT:
handlerText.setText("You Are Handler");
Log.i(TAG, "handleMessage: "+handlerText.getText().toString());
break;
default:
break;
}
}
};
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handlerText =(TextView)findViewById(R.id.handler_text);
handlerButton = (Button)findViewById(R.id.handler_button);
handlerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//启动线程发送Message
new Thread(new Runnable(){
@Override
public void run(){
Message message = new Message();
message.what=UPDATE_TEXT;
handler.sendMessage(message);
}
}).start();
}
});
}
}
方式二:Handler.post()
public class MainActivity extends AppCompatActivity{
private static String TAG = "MainActivity";
private TextView handlerText;
private Button handlerButton;
private Handler handler = new Handler();
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handlerText =(TextView)findViewById(R.id.handler_text);
handlerButton = (Button)findViewById(R.id.handler_button);
handlerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//启动线程发送Message
new Thread(new Runnable(){
@Override
public void run(){
handler.post(new Runnable(){
@Override
public void run(){
handlerText.setText("You Are Handler");
Log.i(TAG, "handleMessage: "+handlerText.getText().toString());
}
});
}
}).start();
}
});
}
}