0、目录
一、相关概念简介
二、使用方式
三、使用步骤
四、实例讲解
五、总结
一、相关概念简介
Handler是一套消息传递机制,通常的作用是在多线程的应用场景中,将子线程(工作线程)中需要更新UI的相关信息传递到主线程,从而实现工作线程对UI的更新。
二、使用方式
Handler的使用方式可以根据发送消息的方式不同而分为两种:
Handler.sendMessage()和Handler.post()
三、使用步骤
方式一,使用Handler.sendMessage()
在该使用方式中,因创建Handler的方式不同,又可分两种:创建Handler子类、使用匿名Handler内部类,但本质都是相同的,都是继承Handler类创建子类
一,创建Handler子类
1、自定义Handler子类,并重写handleMessage()方法
class mHandler extends Handler {
//重写handleMessage()方法
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//执行的UI操作
}
}
2、主线程中创建mHandler的实例
private mHandler mhandler = new mHandler();
3、在子线程中创建需要发送的消息对象
Message msg = Message.obtain();
msg.what = 1;
4、在子线程中通过Hander发送消息到消息队列
mhandler .sendMessage(msg);
5、启动子线程
二、使用匿名Handler子类
1、在主线程中通过匿名内部类创建Handler类对象
Handler mhandler = new Handler(){
//重写handleMessage()方法
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//执行的UI操作
}
};
2、在子线程中创建需要发送的消息对象
Message msg = Message.obtain();
msg.what = 1;
3、在子线程中通过Hander发送消息到消息队列
mhandler .sendMessage(msg);
4、启动子线程
方式二、使用Handler.post()方法
1、在主线程中创建Handler实例
private Handler mhandler = new Handler();
2、在子线程中使用Handler.post()
mhandler.post(new Runnable() {
@Override
public void run() {
//执行的UI操作
}
});
3、启动子线程
四、使用实例
方式一,使用Handler.sendMessage()
一,创建Handler子类
public class MainActivity extends AppCompatActivity {
TextView mTxtShowTest;
Button mBtn1, mBtn2, mBtn3;
// 2、在主线程中创建自定义Handler(mHandler)的实例
private mHandler mhandler = new mHandler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTxtShowTest = (TextView) findViewById(R.id.mTxtShowTest);
mBtn1 = (Button) findViewById(R.id.mBtn1);
mBtn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
// 3、创建所需消息对象
Message msg = Message.obtain();
msg.what = 1;
//4、发送消息
mhandler.sendMessage(msg);
}
// 5、开启线程
}).start();
}
});
}
//1、自定义Handler子类,继承Handler,重写handleMessage()方法
class mHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//执行的UI操作
mTxtShowTest.setText("新建Handler子类方法");
}
}
}
二、使用匿名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.post()方法
public class MainActivity extends AppCompatActivity {
TextView mTxtShowTest;
Button mBtn1, mBtn2, mBtn3;
//1、在主线程中创建Handler的实例
private Handler mhandlerPost = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTxtShowTest = (TextView) findViewById(R.id.mTxtShowTest);
mBtn3 = (Button) findViewById(R.id.mBtn3);
mBtn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
//2、在子线程中使用Handler.post()
mhandlerPost.post(new Runnable() {
@Override
public void run() {
//执行的UI操作
mTxtShowTest.setText("post方法");
}
});
}
//4、开启线程
}).start();
}
});
}
}
五、总结
本问主要介绍了Handler的使用方法,后面将继续介绍Handler的原理和源码分析。
参考:https://www.jianshu.com/p/f0b23ee5a922
版权声明:本文为haovin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。