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());

以及我们不需要代码全部打出 只要一部分他们就会提示节省我们的工作效率

java线程池中子线程和子线程是如何通讯的 子线程handler_UI