Hnadler的基本使用

来源:互联网 发布:社交网络 网盘 编辑:程序博客网 时间:2024/06/01 10:32

一、Handler的用处

handler用来发送和处理消息或者Runnable对象,且这些数据通常与其相应的Message Queue相关联,主要有两个方面的应用:(1)周期性的在未来的某个时段执行(2)将Runnable放入一个不同于本线程的线程进行执行

另外注意的是当创建一个默认的Handler时,它会自动与它所在的线程的MessageQueue关联,MessageQueue是Handler所必须需要的

二、主要的使用方法;

(1)Post()系列来执行Runnable对象承载的任务

(2)SendMessage()系列方法来发送一个Message对象来进行相应的操作任务

(3)remove()系列方法来取消队列中的任务

三、相关的类:

(1)Looper:用于为线程执行消息循环,默认的线程没有该类,通过static 方法Prepare()和Loop()来创建和初始化一个Looper,然后可以通过myLooper()来获取与当前线程绑定的Looper, handler的所有消息都会发往Looper,然后在从Looper中去除消息进行执行

(2)CallBack接口;如果使用该接口来初始化Handler,所有消息都会先经过这里的handleMessage,可以在这里进行预处理,然偶再由handler处理

(3)HandlerThread:是一个实用类,创建一个线程且带有一个Looper,可以使用这个Looper来创建handler

四:代码如下:

//在自定义的类中使用handlerclass Handelr_02 extends Thread{    Handler handler;    @Override    public void run() {        Looper.prepare();        handler=new Handler(){//handler须在looper之前创建,且Handler会自动绑定looper            @Override            public void handleMessage(Message msg) {                Log.i("tagsome","number:="+msg.arg1);            }        };        Looper.loop();    }}public class MainActivity extends ActionBarActivity {    Handler handler_01=new Handler(){        @Override        public void handleMessage(Message msg) {            button.setTextSize(msg.arg1);            Log.i("tagsome","msg arg1="+msg.arg1);        }    };    Button button;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        button=(Button)findViewById(R.id.normal_use_01);    }    public void onHnadlerTest(View view){        switch (view.getId()){            case R.id.normal_use_01:                Message msg01=new Message();                msg01.arg1=10;                handler_01.sendMessage(msg01);break;            case R.id.normal_use_02:            //从公共的消息池中获取消息实例,若没有则会创建一个消息,比使用new要高效                Message msg02=handler_01.obtainMessage(1,40,40);               // handler_01.sendMessage(msg02);                msg02.sendToTarget();//与上面的意思相同                break;            case R.id.normal_use_03:                Message msg03=new Message();                msg03.arg1=999;                Handelr_02 htest=new Handelr_02();                htest.start();                try {                    Thread.sleep(500);//防止并发冲突,以免handler的错误引用                } catch (InterruptedException e) {                    e.printStackTrace();                }                htest.handler.sendMessage(msg03);                break;            case R.id.normal_use_04:                HandlerThread handlerThread=new HandlerThread("myhandlerThread");                handlerThread.start();//需要先启动线程                Looper looper=handlerThread.getLooper();                Handler handler04=new Handler(looper){                    @Override                    public void handleMessage(Message msg) {                        Log.i("tagsome","uesing handler thread's looper");                    }                };                handler04.sendEmptyMessage(0);                break;        }    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();        //noinspection SimplifiableIfStatement        if (id == R.id.action_settings) {            return true;        }        return super.onOptionsItemSelected(item);    }}



0 0