关闭

android学习--Handler的使用

472人阅读 评论(0) 收藏 举报

主要学习了HandlerRunnableThreadHandlerThreadLooperMessageBundle7 类的使用

1.Handler :Handler用来发送和处理与线程消息队列相关的Message以及Runnable对象;每个 Handler的实例都与一个单线程以及线程的消息队列相关,创键一个新的Handler对象,就会绑定在创建它的线程的线程或消息队列上;Handler投递消息和runable对象到消息队列并且在它们从消息队列中取出时执行之

post(Runnable)postAtTime(Runnable,long)postDelayed(Runnable,long)sendMessage(Message)

sendEmptyMessage(int) 加入messagerunnable到消息队列

hanldleMessage 从消息队列中取messagerunnable进行处理

obtainMessage从全局的消息池中取出一个新的消息;

总之:Handler就是用来投递(postsendMessagerunnablemessage到主线程消息队列,以及 从队列中取出消息的进行处理(handleMessage);

注:(1obtainMessage得到的消息与new一个消息的区别:new是需要重新申请,效率低; obtainmessage是从消息池里拿来一个msg,并且使用完后会放到pool里,可以重新利用,不用重新分配空间,效率高;

2sendXXX发送后直接返回,postXXX处理后再返回

3handler与创建它的线程相关联,而且也只与创建它的线程相关联,handler运行在创建它的线程中,所以,如果在handler中进行耗时的操作,会阻塞创建它的线程;


2.RunnableThread:

1java中有两种方式实现多线程,一种继承Thread类,一种是实现runnalbe接口

2Threadjava.lang包中定义的,一个类只要继承类Thread类同时复写了本类中的run方法 就可以实现多线程操作类,但是一个类只能继承一个父类,这是此方法的局限;

3)在实际开发中很少使用Thread类,而是通过Runnable接口完成的;在使用Runnable定义的子类中没有start方法,只有Thread类才有,Thread类中有一个构造方法publicThreadRunnabletarger)此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动runnable实现多线程;

4)在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优点:避免继承的局限,一个类可以继承多个接口,适合资源的共享

其实Thread类也是Runnable接口的子类

注:Runnable只需要实现一个run接口,而且只有这个接口;


3.Looper:消息泵,不断从MessageQueue中抽取Message执行,因此一个MessageQueue需要一 Looper

HandlerLooperMessageQueue简单的三角关系:LooperMessageQueue一一对应,创建 一个Looper的同时,会创建一个MessageQueue,而Handler与它们的关系是,Handler会引用当前线程里特定的LooperMessageQueue、一个Looper可以对应多个Handler

注:getMainLooper(获取当前应用的主looper)getThread(获取与该looper对应的线程)、 myQueue(返回与当前线程相关的Looper对象)、loop(运行对应线程的messagequeue)、quit(与loop对立)、prepare(用该looper对象初始化当前线程)


4.HandlerThreadandroid的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的 线程一般都会有一个LooperHandlerThread就是Android提供的一个封装好的带有looper的线程类;(可以在Handler定义的子线程中操作Handler,不影响原来的Activity主线程,实现异步


5.使用handler执行新进程

1)生成一个HandlerThread对象;

2)在使用HandlerThreadgetLooper方法前调用该类对象的start方法

3)创建一个继承于Handler类的子类,实现一个参数为Looper对象的构造方法


6.BundleAndroid中的Bundle用于传递自定义的数据,在Bundle中已经封装好了简单数据类型 Stringintfloat等(putIntputString等等方法将这些不同的数据打包到Bundle对象中)


7.Message

obtainMessagesetDatasendToTarget(把该message发送给Handler)、getData


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:15321次
    • 积分:315
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:12篇
    • 译文:0篇
    • 评论:2条
    文章分类