handler解析

handler的应用场景:

1.to schedule messages and runnables to be executed as some point in the future;
2.to enqueue an action to be performed on a different thread than your own.
第一种是相当于一个定时器,你可以在某个时间点去通过handler执行一个任务。
代码如下:

 private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            //在这里执行任务
            return true;
        }
    });
 handler.sendEmptyMessageDelayed(1,5000); //触发任务执行在5s后

上面我们是在主线程中执行,直接创建handler就可以了,因为loop和消息队列在主线程中已经创建好了,但是如果在子线程想做定时做的事呢?那就得自己创建looper,looper创建的时候消息队列在looper构造中已经创建,下面的代码我们就可以在子线程实现handler定时任务。

 @Override
    public void run() {
        //在这里执行任务
        Looper.prepare();
        handler = new Handler(new Handler.Callback() {
           @Override
           public boolean handleMessage(Message msg) {
               //在这里执行任务
               Log.i(TAG, "aa: "+Thread.currentThread().getName());
               return true;
           }
       });
        handler.sendEmptyMessageDelayed(1,5000);
        Looper.loop(); //这里注意,loop()是一个死循环,所以后面事不能执行代码的。
    }

接下来看第二种应用场景,那就是在不同线程之间互传消息,最常用的就是我们在子线程中执行任务,在主线程中更新ui:
首先在主线程创建handler:

 private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            return true;
        }
    });

然后我们就可以从子线程向主线程发送消息了:

  new Thread(new Runnable() {
            @Override
            public void run() {
                Message message = handler.obtainMessage();
                message.arg1 = 1;
                handler.sendMessageDelayed(message, 3000);
            }

上面是子线程向主线程发送消息,那么也可以主线程向子线程发送消息,这样的话需要我们在子线程中创建属于子线程的handler,然后在主线程中调用:

 @Override
            public void run() {
                Looper.prepare();
                mhandler = new Handler(new Handler.Callback() {
                    @Override
                    public boolean handleMessage(Message msg) {
                        handler.sendEmptyMessageDelayed(3,3000);
                        return true;
                    }
                });
                Looper.loop();
            }

然后在主线程中用子线程mhandler发送消息就可以了:

    mhandler.sendEmptyMessage(1);

handler最一般应用的场景也就这两种。原理这里不讲了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值