hander

来源:互联网 发布:互联网 学什么知乎 编辑:程序博客网 时间:2024/05/16 09:20

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(){@Overridepublic 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);}@Overridepublic 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参数的构造方法

0 0
原创粉丝点击