继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Android Handler的使用

慕运维2858188
关注TA
已关注
手记 123
粉丝 63
获赞 512
Handler的最大作用就是线程的切换

Handler 对象既发送信息又处理消息

把一个消息从一个线程发送到另一个线程
 //在主线程创建一个Handler对象。
    //重写Handler的handleMessage方法,这个就是接收并处理消息的方法。
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            //msg就是子线程发送过来的消息。
        }
    };

    //开启一个子线程
    new Thread(new Runnable() {
            @Override
            public void run() {
                //在子线程发送一个消息。
                Message msg = new Message();
                handler.sendMessage(msg);
            }
        }).start();
发送一个空消息
handler.sendEmptyMessage(what);
Message对象有一个Object类型的obj属性
   Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            Log.i(TAG,"Handler 发送过来的消息是:" + msg.obj);
        }
    };

    new Thread(new Runnable() {
            @Override
            public void run() {
                Message msg = new Message();
                msg.obj = "我是消息数据";
                handler.sendMessage(msg);

            }
        }).start();

使用 what 来标识消息

  Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {

            switch (msg.what) {
                case 1:
                    Log.i(TAG, "第一个消息是:" + msg.obj);
                    break;

                case 2:
                    Log.i(TAG, "第二个消息是:" + msg.obj);
                    break;
            }
        }
    };

    new Thread(new Runnable() {
            @Override
            public void run() {
                Message msg1 = new Message();
                msg1.obj = "第一个消息";
                msg1.what = 1;
                handler.sendMessage(msg1);

                Message msg2 = new Message();
                msg2.obj = "第二个消息";
                msg2.what = 2;
                handler.sendMessage(msg2);
            }
        }).start();

Handler还可以post一个Runnable

   new Thread(new Runnable() {
            @Override
            public void run() {
                //在子线程post一个Runnable对象
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        //这里是消息处理的方法
                        //这里运行在主线程。
                    }
                });
            }
        }).start();

子线程使用Handler

    //声明Handler;
    Handler handler;
    new Thread(new Runnable() {
        @Override
        public void run() {
            //创建当前线程的Looper
            Looper.prepare();
            //在子线程创建handler对象
            handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    //这里是消息处理,它是运行在子线程的
                }
           };
           //开启Looper的消息轮询
           Looper.loop();
       }
   }).start();

   mBanner.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           //在主线程发送一个消息到子线程
           Message msg = new Message();
           handler.sendMessage(msg);
       }
   });
退出消息轮询
  Looper.myLooper().quit();
  Looper.myLooper().quitSafely();

用指定的Looper来创建Handler

    new Thread(new Runnable() {
        @Override
        public void run() {
            //获取主线程的Looper
            Looper looper = Looper.getMainLooper();
            //用主线程的Looper创建Handler
            handler = new Handler(looper) {
                @Override
                public void handleMessage(Message msg) {
                //这里是运行在主线程的
                }
            };
        }
    }).start();

同一消息不能发两次

 //同一个Message发送了两次
    Message msg = Message.obtain();
    handler.sendMessage(msg);
    handler.sendMessage(msg);
打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP