Handler的常见用法

来源:互联网 发布:女鞋淘宝鞋店知乎 编辑:程序博客网 时间:2024/06/04 23:35

这次对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的常见用法做一个小结而已(我懒怪我咯 =。=)。


按键60秒倒计时小程序:

在线程中new message 再通过handle的sendMessage发送
Message message = new Message();
message.what = TIMER_DESC;
message.obj = count+"秒";
handler.sendMessage(message);
new 一个Handle 重写handleMessage()方法
Handler handler= new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case TIMER_DESC:
String time = (String) msg.obj;
mButtonTimer.setText(time);
break;
}
}
};
简写:
发送
mButtonTimer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count = 60;
handler.sendEmptyMessageDelayed(TIMER_DESC,1000);
}
});
接收:
 Handler handler= new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case TIMER_DESC:
count--;
if(count>=0){
handler.sendEmptyMessageDelayed(TIMER_DESC, 1000);
mButtonTimer.setText(count+"秒");
}
break;
}
}
};

原创粉丝点击