Handler 简单易懂使的用
一、简述Handler
在android中,我们开启一个应用程序的时候,会开启一个UI线程(主线程),当你在开启一个子线程,并要更新UI时候,如下:
new Thread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"在子线程中通知",Toast.LENGTH_SHORT).show();
}
}).start();
就会出现以下的错误
所以呢!!!这个时候我们就需要handler来为我们传送消息。
二、Hanlder的使用
Handler有两个用途:
- 在运行中,对一些操作进行设置延迟
- 在多线程中,给主线程发送消息更新UI
它有几个常用的方法:
post (Runnable) //传送runnable,进行消息发送
postAtTime(Runnable,long)//定时发送消息
postDelayed(Runnable,long)//延时发送消息
sendEmptyMessage(int)//发送空消息
sendMessage(Message)//将消息压入消息池中
sendMessageAtTime(Message,long)//定时传入消息
sendMessageDelayed(Message,long)//延时传入消息
接下来对post和sendMessage方法进行举例:
- post(Runnable)方法
final Runnable runnable = new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"在子线程中UI更新",Toast.LENGTH_LONG).show();
}
}; //实例化一个Runnable对象,并重写run()方法
final Handler handler = new Handler();
new Thread(new Runnable() {
@Override
public void run() {
handler.post(runnable); //调用handler的post方法
}
}).start();
这个方法是很简单啦!
接下来,我们来学一学sendMessage()方法
- sendMessage(Message)方法
final Handler handler = new Handler(){
//在实例Handler对象是需要重写handleMessage方法,在里面实现UI更新操作
@Override
public void handleMessage(Message msg){
//判断msg的标签
if(msg.what == 1){
Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_LONG).show();
}
}
};
new Thread(new Runnable() {
@Override
public void run() {
//用handler.obtainMessage()活动当前Message
// 或者 用Message.obtain()方法
Message msg = handler.obtainMessage();
//msg的what属性是一个整数型标签
msg.what = 1;
//msg的obj属性是Object类型
msg.obj = "在子线程中更新UI"
handler.sendMessage(msg);
}
}).start();
这篇文章只是简单介绍了Handler的使用方法,希望大家能get到方法的使用,能举一反三,接下来我会在写一篇关于Handler、Looper、MessageQueue这三个消息传送机制的详细介绍