Handler常见用法小结

这次对Hanlder的常见用法做一个小结,巩固一下基础知识。在Handler的异步操作中,我们会使用到Handler,Message,Looper。


Handler一般用来接收Message和发送Message

接收Message:

Handler handler=new Handler(new Handler.Callback() {
        int position;
        @Override
        public boolean handleMessage(Message msg) {
            switch (msg.what){
                case 1:
//			执行接收Message后的逻辑
                    break;
            }
            return true;
        }
    });
或者:

    Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
       //执行逻辑
    }
};
发送消息:

handler.sendEmptyMessage(1);

or(需要携带内容的):

Message message=new Message();
message.what=1;
message.obj="haha";
handler.sendMessage(message);
or(所得到的Message是从消息队列中获取,避免了new Message的内存开销,其源码中也是执行了target.sendMessage()方法,target就是handler ):

Message m=handler.obtainMessage(1,2,3,"quan");
m.sendToTarget();



Handler中的定时器

在Handler中给我们提供了postDelayed(Runnable r,long times)方法来完成定时器的功能

Runnable runnable=new Runnable() {
    @Override
    public void run() {
        handler.sendEmptyMessage(1);
        handler.postDelayed(runnable, 1000);
    }
};
点击事件调用:

       findViewById(R.id.bn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handler.postDelayed(runnable,1000);
            }
        });
最后在handMessage方法中进行逻辑处理




更新UI的操作

除了上述的发送Message的方式来更新UI,Handler还有一个post方法可以更新UI,其运行的线程和当前的Handler的线程一致,。

handler.post(new Runnable() {
    @Override
    public void run() {
        textView.setText("");
    }
});



在子线程中接收消息

在子线程中接收消息,我们要用到Looper,主线程不用,因为主线程已经默认使用Looper了,我们会使用looper的两个主要方法,一个是prepare和loop,前一个是创建Looper对象,后一个是执行Looper循环功能。

public Handler handler1;
public class LoopThread extends Thread{
    @Override
    public void run() {
        Looper.prepare();
        handler1=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what){
                    case 1:
                        Toast.makeText(getApplication(),msg.obj+","+msg.arg1+","+msg.arg2+"",Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        };
        Looper.loop();
    }
}
然后我们使用这个自定义的Looper线程

        new LoopThread().start();

        findViewById(R.id.bn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送消息的方法
            }
        });



暂时就这样简单粗暴的总结一下,网上的大神们都给出了很多的原理的解析,我觉得我把自己关一天也不一定写的有别人详细,所以至于原理的东西,大家去看看那些大神的博客就好了,其实也并不难理解,我也就是针对于Handler的常见用法做一个小结而已(我懒怪我咯 =。=)。



---------------------------------------------END












  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值