大家在Android开发中不免会遇到主线程跟新UI,线程切换的场景,其中Handler就是一名大将了有必要对他进行了解。
一、图解Handler的基本概念
什么是Handler呢,Handler是Android给我们提供来跟新UI的一套机制,也是一套消息处理的机制,可发送也可通过他来处理消息,我们看下图。
二、为什么用Handler
Android为什么要设计只能通过Handler机制跟新UI呢,最根本目的就是解决多线程并发问题,只有主线程能更新UI,
试想多线程进行更新UI,又没有枷锁机制,会跟新界面混乱,如果对跟新ui 操作进行枷锁处理又会导致性能下降,Handler就出现了
三、Handler的使用步骤
- 主线程声明Handler实例
private Handler mHandler = new Handler(new Handler.Callback() {
/**
* @param message callback用于获取handler发送的消息,
* @return 如果返回true就回去成功不会向下传递老,即不执行下面的handleMessage方法达到拦截目的
*/
@Override
public boolean handleMessage(Message message) {
return false;
}
}){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 0:
//在这里可以进行UI操作
//对msg.obj进行String强制转换
String str = (String) msg.obj;
mTvShow.setText(str);
break;
default:
break;
}
}
};
- 子线程发送消息
mTvShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);//模拟网络操作
} catch (InterruptedException e) {
e.printStackTrace();
}
//创建一个message设置what字段的值为1,主要是区分不同的message
//设置message.obj的内容,调用Handler的message对象
String str = "Nice to Meet You";
Message msg = new Message();//创建也可用复用系统的message对象Message msg = mHandler.obtainMessage();
msg.what = 0;//消息标示
msg.arg1=2;//存放整形数据,如果携带数据简单,优先使用arg1和arg2,比Bundle更节省内存。
msg.arg2=3; //存放整形数据
//msg.obj = str;//msg.obj = xxx可传递一个对象
Bundle bundle=new Bundle();
bundle.putString("dd","adfasd");
bundle.putInt("love",5);
msg.setData(bundle);
msg.obj=bundle; //用来存放Object类型的任意对象
mHandler.sendMessage(msg);//子线程中向UI线程发送msg进跟新UI
/**
* mHandler.sendEmptyMessage(int);发布一个空消息
* mHandler.sendMessage(msg);允许你安排一带数据的Message对象到队列中等待跟新。
* mHandler.sendMessageAtTime(Message,long);
* mHandler.sendMessageDelayed(Message,long);
* sendEmptyMessageAtTime(int what, long uptimeMillis); //定时发送空消息
* sendEmptyMessageDelayed(int what, long delayMillis); //延时发送空消息
* sendMessageAtFrontOfQueue(Message msg); //最先处理消息(慎用)
*/
}
}).start();
}
});