简谈Handler
为什么要用Handler
Handler作用是处理android的异步消息
因为主线程不能执行耗时程序,这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,而UI更新只能在主线程执行,所以这个时候,Handler就承担着接受子线程传过来的(子线程用sendMessage()方法传弟)Message对象 , 传送给主线程,主线程便会执行更新UI操作,
什么是Handler
handler是Android给我们提供用来处理异步消息的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它处理消息
什么是Looper
Looper是一个消息循环,每个线程只有一个Looper,会不断的从MessageQueue取出消息,发送给主线程处理
什么是MessageQueue
MessageQueue是一个消息队列,用来存放子线程发来的消息,再由looper取出发送给主线程处理
Looper和MessageQueue在创建Activity时会自动创建
Handler怎么用
1、创建handler对象:
private Handler handler = new Handler(){
2. @Override
3. //书写handleMessage方法,用于第三步接收并处理信息
4. public void handleMessage(Message msg) {
5. super.handleMessage(msg);
13. }
14. }
15. };
2、发送消息
//创建子线程
2.new Thread(new Runnable() {
3. @Override
4. public void run() {
5. try {
6. //子线程睡眠5秒
7. Thread.sleep(5000);
8. } catch (InterruptedException e) {
9. e.printStackTrace();
10. }
11. //发送更新UI的信息
12. Message message = handler.obtainMessage();
13. //发送信息的三种方法
14. message.what = 1; //只能为int型
15. message.a=2; //只能为int型
16. message.b= 3;
17. message.obj = "准备下载"; //可以是字符串,对象等
18. handler.sendMessage(message);
19. }
20. }).start(); //启动线程
3、接收并处理消息
private Handler handler = new Handler(){
2. @Override
3. //书写handleMessage方法,用于第三步接收并处理信息
4. public void handleMessage(Message msg) {
5. super.handleMessage(msg);
6. //这里是发送消息后对消息进行处理
7. int a = msg.a;
8. int b = msg.b;
9. String tip = (String) msg.obj;
10. if (msg.what==1){
11. //更新UI
12. downLoadTip.setText("下载完成"+a+b+tip);
13. }
14. }
15. };
案例解析——倒计时Demo
1.我们通过子线程将结果每隔一秒发送给Handler,由Handler来进行更新UI的操作
new Thread(new Runnable() {
2. @Override
3. public void run() {
4. try {
5. for (int i = count; i >0 ; i--) {
6. //给Handler发送消息
7. handler.sendEmptyMessage(i);
8. //sleep:线程休息的间隔多久 1000毫秒=1秒
9. Thread.sleep(1000);
10. }
11. } catch (InterruptedException e) {
12. e.printStackTrace();
13. }
14. }
15. }).start();//start,开启线程
其中count=10,这里是固定的数值,当然你可以通过EditText由用户输入数据
2.创建出Handler对象,并接收子线程发送过来的消息,然后进行UI的更新
private Handler handler=new Handler(){
2. @Override
3. public void handleMessage(Message msg) {
4. super.handleMessage(msg);
5. //msg.what是我们子线程发送过来的消息
6. textView.setText(msg.what+"");
7.
8. }
9. };