简谈Handler

简谈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.    };  

猜你喜欢

转载自blog.csdn.net/source_sc/article/details/80610095