读书人

Android开发 - Handler的应用

发布时间: 2012-07-18 12:05:41 作者: rapoo

Android开发 - Handler的使用

back >>

1. Handler的作用

??? * handler 主要用于消息的异步处理(处理一个耗时较长并且可能不一定有结果的操作)
??????? - 我的理解,handler就是一个消息队列的这样的数据结构
??????? - 它提供了一个线程异步处理的方案,可将本线程(当前Activity线程,即HandlerActivity线程)和post到handler里的线程异步执行(也就是并行操作,互不干扰)
??????? - 可以往handler里添加线程对象,也可以删除线程对象。队列的操作方式是先进先出
??????? - 线程对象从消息队列中取出后,就会执行该线程对象的run方法,从而执行指定的操作

?

??? * handler例子--控制进度条(工程代码请参考01_14_src.zip)

??????? - handler 里其实有两个队列,一个是线程队列,一个是消息队列


2. Handler与线程的关系
??? * 默认情况下,handler和调用该handler的activity是同一个线程(工程代码见01_15_src.zip)
??????? - 因为handler处理post到线程队列中的线程对象时,其实是直接执行了该线程对象的run方法,而不是start方法
??? 要想真正开辟一个新线程,需要如下操作:

        HandlerThread handlerThread = new HandlerThread("handler_thread");        handlerThread.start();        //然后覆写Handler类的方法        class MyHandler extends Handler {            public MyHandler() {               }               public MyHandler(Looper looper) {                super(looper);            }               public void handleMessage(Message msg) {                //接收数据                Bundle b=msg.getData();                int age =b.getInt("age");                System.out.println("age:"+age);                System.out.println(Thread.currentThread().getId());                System.out.println("handlerMessage");            }        }        MyHandler myHandler = new MyHandler(handlerThread.getLooper());        Message msg = myHandler.obtainMessage();//获得消息        Bundle b=new Bundle();        b.putInt("age", 20);        msg.setData(b);        msg.sendToTarget();//发送消息               发送消息的两种方法:        --myHandler.sendMessage(msg);        --msg.sendToTarget();


3. bundle对象
??? * bundle对象其实就是一个数据存储的工具,一般用于向消息传递数据
??????? - 同hashmap有点像,只是bundle键值对的键是String的,而值可以随便。
??? * 向消息传递数据的方式:
??????? - 使用Message的成员变量
??? ??????? msg.arg1,msg.arg2,msg.obj等
??????? - 使用bundle
??? ??????? Bundle b=new Bundle();
??? ??????? b.putInt("age", 20);
??? ??????? msg.setData(b);
???
4. Looper对象
??? * 循环从队列中取得消息
??????? - 一般自己不创建。android提供了HandlerThread类实现循环从队列中取消息的功能,handlerThread.getLooper()

读书人网 >Android

热点推荐