新建了一个qq群 482543750,欢迎一起学习Android的小伙伴加入。
提供各种Android学习资料,面试资料,Android简历模板。
Handler是开发人员在面试过程中最常见的问题之一了,这篇文章将较为全面地对Handler进行解读,包括源码层,以及使用方法。
如果看完文章有疑问,欢迎在评论中一起探讨
基本内容包括:
看完文章之后,可以用这个图片进行复习。
一、什么是Handler
Handler是Android提供用来更新UI的一套机制,也是一套消息处理机制,可以用它来发送消息,也可以用它来接收消息。
二、为什么使用Handler
Android在设计之时,就封装了一套消息的创建、传递、处理机制,若不遵循这样的处理机制,就没办法更新UI信息,并且会抛出异常
三、Handler用法
1、postdelayed()延时发送执行子线程
文字轮询Demo(实现每隔一秒钟更新一次Textview的功能)
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
private String[] str = new String[]{"傲慢","偏见","僵尸"};
private int index = 0;
MyRunnable myRunnable = new MyRunnable();
private class MyRunnable implements Runnable{
@Override
public void run() {
index = index % 3;
mTextView.setText(str[index]);
index ++;
mHandler.postDelayed(myRunnable,1000);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv);
mHandler.postDelayed(myRunnable,1000);
}
}
2、sendMessage()回调handleMessage()传递消息
Demo:在子线程中得到信息,发送至主线程,更新textview的内容
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
mTextView.setText(msg.obj+""+ "arg1="+msg.arg1 + " arg2="+msg.arg2);
super.handleMessage(msg);
}
};
private class Person{
String name;
int age;
@Override
public String toString() {
return "name="+name+" age="+age;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.tv);
new Thread(){
@Override
public void run() {
Message msg = new Message();
msg.arg1 = 1;
msg.arg2 = 2;
Person person = new Person();
person.name = "pig";
person.age = 10;
msg.obj = person;
mHandler.sendMessage(msg);
}
}.start();
}
}
3、sendToTarget()传递消息
与第二种用法原理一致
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
mTextView.setText(msg.obj+""+ "arg1="+msg.arg1 + " arg2="+msg.arg2);
super.handleMessage(msg);
}
};
private class Person{