一、前言
在开发中,我们常常使用 Handler 处理线程间异步通信。子线程无法更新UI,可以通过handler讲UI更新切换到主线程中执行。
什么是handler呢?
handler是一套Android异步通信机制,或者说消息传递机制。
它的主要作用便是在多线程场景中,实现工作线程对UI的更新操作,从而实现异步通信。
为什么要用handler呢?
因为在android开发中,只有主线程(UI线程)能更新UI组件,在实际开发中,存在多个线程需要并发更新UI的情景。为保证更新UI的同时,线程安全,我们需要使用handler机制去完成这么一项工作。
二、使用
Handler的使用方式,因发送消息到消息队列的方式不同而可以分为两种方式:sendMessage(),post()
1、sendMessage()方式
在该方式中,根据handler的实例,又可分为两种方式:新建Handler
子类(内部类)、匿名 Handler
子类
(举个栗子,工作线程更新界面textview)
新建Handler
子类(内部类)
public class MainActivity extends AppCompatActivity {
public TextView mTextView;
public Handler mHandler;
class Myhandler extends Handler {
@Override
public void handleMessage(Message msg) {
// 根据 Message对象的what属性 标识不同的消息
switch (msg.what) {
case 1:
mTextView.setText("线程1更新UI");
break;
default:
mTextView.setText("线程x更新UI");
break;
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.show);
// 在主线程中创建Handler实例
mHandler = new Myhandler();
new Thread() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//创建消息对象
Message msg = Message.obtain();
msg.what = 1; // 消息标识
msg.obj = "A"; // 消息内存存放
mHandler.sendMessage(msg);
}
}.start();
}
}
匿名 Handler
子类
public class MainActivity extends AppCompatActivity {
public TextView mTextView;
public Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.show);
// 在主线程中 通过匿名内部类创建Handler类对象
mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
// 根据不同线程发送过来的消息,执行不同的UI操作
switch (msg.what) {
case 1:
mTextView.setText("线程1更新UI");
break;
default:
mTextView.setText("线程x更新UI");
break;
}
}
};
new Thread() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//创建所需的消息对象
Message msg = Message.obtain();
msg.what = 1; // 消息标识
msg.obj = "A"; // 消息内存存放
mHandler.sendMessage(msg);
}
}.start();
}
}
2、post()方式
public class MainActivity extends AppCompatActivity {
public TextView mTextView;
public Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.show);
// 在主线程中创建Handler实例
mHandler = new Handler();
new Thread() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mHandler.post(new Runnable() {
@Override
public void run() {
mTextView.setText("线程1更新UI");
}
});
}
}.start();
}
}