Hander提供一个异步的消息处理机制
在Activity中执行下载等复杂操作不应该放在Activity中执行,应该用Hander操作
Handler其实并不会启动新的线程,而是直接调用run方法
使用HandlerThread对象,实现使用Looper处理消息队列的功能
一、基本用法
1.创建一个Handler对象
Handler handler = new Handler();
2.调用Handler的post方法,将要执行的的线程对象添加到队列中
handler.post(updataThread);
在run方法内部,执行post或者postDelayed方法
Runnable updataThread = new Runnable(){
@Override
public void run(){
System.out.println("Hello World");
//在run方法内部,执行post或者postDelayed方法
handler.postDelayed(updataThread, 3000);
}
}
二.Handler实现进度条的移动
Handler对象中有两个队列,一个是线程队列,另一个是消息队列
1.单击Button显示进度条,加载进程队列
startButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
bar.setVisibility(View.VISIBLE);
updateBarHandler.post(updateThread);
}
});
2.写Handler类,重写Message队列
//Handler类,重写Message队列
Handler updateBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
bar.setProgress(msg.arg1);
updateBarHandler.post(updateThread);
}
handleMessage是用来接收消息队列的数据
msg.arg1是msg的成员变量,用它来传递数据会省内存重新添加进程队列,循环
3.写Runnable类,重写run方法
//线程类,匿名类
Runnable updateThread = new Runnable(){
int i = 0;
@Override
public void run() {
System.out.println("Being Thread");
i = i + 10;
//得到消息对象
Message msg = updateBarHandler.obtainMessage();
msg.arg1 = i ;//用arg1传递消息节省内存
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
updateBarHandler.sendMessage(msg);//加入消息队列
if( i == 100 ){
updateBarHandler.removeCallbacks(updateThread);
}
}
};
线程类中获得Handler中的Message对象,给它赋值之后添加到消息队列即可
三、HandlerThread起新线程收发消息
1.首先起一个HandlerThread线程,再获得Message对象
HandlerThread handlerThread = new HandlerThread("handler_thread");
handlerThread.start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
Message msg = myHandler.obtainMessage();//获得Message对象
2.发送Message队列
Bundle b = new Bundle();//容器
b.putInt("age", 20);
b.putString("name", Jhon);
msg.setData(b);
msg.sendToTarget();//发送数据
Bundle是一个Map类型的容器
3.接受消息
class MyHandler extends Handler{
public MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg){
Bundle b = msg.getData();
int age = b.getInt("age");
String name = b.getString("name");
System.out.println("age is" + age + "name is" + name);
}
}
一定要重写带Looper参数的构造方法