hander

Hander提供一个异步的消息处理机制

在Activity中执行下载等复杂操作不应该放在Activity中执行,应该用Hander操作

Handler其实并不会启动新的线程,而是直接调用run方法

使用HandlerThread对象,实现使用Looper处理消息队列的功能

一、基本用法

1.创建一个Handler对象

Handler handler = new Handler();

2.调用Handler的post方法,将要执行的的线程对象添加到队列中

handler.post(updataThread);


3.将要执行的操作写在线程对象的run方法中

在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参数的构造方法

你可能感兴趣的:(Android)