作者:louis | 来源:互联网 | 2023-09-14 10:16
这次对Hanlder的常见用法做一个小结,巩固一下基础知识。在Handler的异步操作中,我们会使用到Handler,Message,Looper。Handler一般用来接收Message和发送Mes
这次对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