这次对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