Handler:更新UI和消息的发送和处理
为什么要使用Handler?
Android本身就封装了一套更新UI和消息处理机制,如果不用Handle,就会出现异常
最根本解决多线程的问题Handle负责消息的发送,Looper负责接收Handle发送的消息,并直接把消息回传给handle自己,MessageQueue是一个存储消息的容器
*更新的四种方法:
handler.post(),
handler.post.postDelayed(),
handler.sendMessage()
handler
eg:每隔3s更新文字
更新文本方法:hand.post(new Runnable)
必须要通过handler更新线程
Handler handler;
TextView textView;
new Thread(){
public void run(){
try{
Thread.sleep(3000);
handle.post(new Runnable(){
public void run(){
textView.setText("更新文本");
}
});
}catch{
e.printStackTrace();
}
}
}.start();
eg:实现图片轮播(每隔3s)
1.在drawable中设置图片
Handler handler;
MyRunnable myRunnable;
int image[]={R.drawable.meinv_1,R.drawable.meinv_2;R.drawable.meinv_3};
2.实现图片轮播
class MyRunnable implements Runnable{
public void run(){
index++;
index=index%3;
imageView.setImageResource(image[index]);
handler.postDelayed(myRunnable,3000);
}
}
3.在主方法中实现更新
handler.postDelayed(myRunnable,3000);
取消轮播
在点击方法中取消
handler.removeCallbacks(myRunnable);
eg:更新文本
Handler handler=new Handler(){
public void handleMessage(Message message){
textView.setText(""+msg.arg0+""+msg.arg1+""+msg.obj);
super.handleMessage(message);
}
}
2.在主方法中设置
//发送消息也可通过message
Message message=Handle.obtainMessage();
message.sendToTarget();
new Thread(){
public void run(){
try{
Thread.sleep(3000);
Message message=new Message();
message.arg0=88;
message.arg1=44;
Person person=new Person();
person.age=40;
//发送很多消息时用obj
person.name="张三";
message.obj=person;
handler.sendMessage(message);
}catch{
e.printStackTrace();
}
super.run();
}
//千万不要忘记start,这是启动线程
}.start();
3.在主类中
class Person{
public String name;
public int age;
public String toString(){
return "姓名:"+name+",年龄:"+age;
}
}
eg:拦截消息
Handler handler=new Handler(new CallBack{
public boolean handleMessage(Message message){
Toast.makeText(getApplicationContext(),""+1;1);
//如果返回false的话就不显示2
}
return true;
}){ public void handleMessage(Message message){
Toast.makeText(getApplicationContext(),""+2;1);
}
};
2.在点击中
handler.sendEmptyMessage(1);