1.什么是Handler?
Handler是Android SDK中处理异步的核心。
Handler的作用就是让子线程通过与UI线程(主线程)通信来更新UI界面
对于Handler的运行机制就是
创建Handler对象,系统就把Handler对象,UI线程和UI线程的消息队列捆绑起来。
当我们在线程中处理后,可以通过Handler对象将消息发出
消息将会按照先后顺序添加到消息队列中
UI线程中的Looper不断从消息队列中取消信息并且刷新UI
并且主线程不允许耗时操作 只有子线程才会有耗时操作。
并且子线程不允许更新UI,只有主线程才有操作权限。
2.什么是Looper和MessageQuenen
对于Looper在Andorid中创建出的普通线程默认是没有消息循环的,run方法执行完毕之后,线程也就结束了。
如果让线程不停地工作循环时,可以使用Looper,将普通的线程变成循环工作的线程。
MessageQueue
当创建Looper时,将会自动创建MessageQuenen并且一个线程中只会存在一个Looper和一个MessageQuenen
当MessageQuenen中有消息时,Looper就会将从MessageQuenen中取出消息。
3.什么是Message
what属性 int类型的消息码
arg1 , arg2 int类型,如果传递的消息仅仅是整形数字,可以将数字赋值给arg1,arg2
obj属性 Object消息,如果传递的消息时String类型或者任意类型可以将数据赋值给obj属性
消息对象,子线程将需要传递到UI线程的信息放入Message对象中,Message对象可以通过Handler对象的obtainMessage方法获得
4.如何使用Handler
在UI线程中创建Handler匿名内部类
在匿名内部类中重写handlerMessage方法
在UI线程中启动子线程
在线程中获得Message对象
将需要传递的数据赋值到Message对象中
通过Handler对象的SendMessage方法发送消息到消息队列中
在handlerMessa方法中接受信息
5.倒计时案例举例
对于Xml中的布局还是和原来一样
我们现在主要介绍Activity中的代码 我在代码中添加了注释方便更好的了解
代码如下 主要 有两段比较
private Handler handler = new Handler() {
//用来接收子线程发来的信息
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// int arg=msg.arg1;//赋值
//String info = (String) msg.obj;
textbtn.setText(msg.what+"");
}downbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//自动获取输入的数字 并且强制类型转换
time = Integer.parseInt(editbtn.getText().toString());
//启动子线程
new Thread(new Runnable() {
@Override
public void run() {
//循环结构倒计时
for (int i =time;i > 0;i--) {
handler.sendEmptyMessage(i);
//倒计时时间间隔
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
});
对于获取输入的数字我们要使用强制转换
time = Integer.parseInt(editbtn.getText().toString());
以及我们不需要代码全部打出 只要一部分他们就会提示节省我们的工作效率