主要学习了Handler、Runnable、Thread、HandlerThread、Looper、Message、Bundle7个 类的使用
1.Handler :Handler用来发送和处理与线程消息队列相关的Message以及Runnable对象;每个 Handler的实例都与一个单线程以及线程的消息队列相关,创键一个新的Handler对象,就会绑定在创建它的线程的线程或消息队列上;Handler投递消息和runable对象到消息队列并且在它们从消息队列中取出时执行之
post(Runnable)、postAtTime(Runnable,long)、postDelayed(Runnable,long)、sendMessage(Message)
sendEmptyMessage(int) 加入message、runnable到消息队列
hanldleMessage 从消息队列中取message或runnable进行处理
obtainMessage从全局的消息池中取出一个新的消息;
总之:Handler就是用来投递(post、sendMessage)runnable和message到主线程消息队列,以及 从队列中取出消息的进行处理(handleMessage);
注:(1)obtainMessage得到的消息与new一个消息的区别:new是需要重新申请,效率低; obtainmessage是从消息池里拿来一个msg,并且使用完后会放到pool里,可以重新利用,不用重新分配空间,效率高;
(2)sendXXX发送后直接返回,postXXX处理后再返回
(3)handler与创建它的线程相关联,而且也只与创建它的线程相关联,handler运行在创建它的线程中,所以,如果在handler中进行耗时的操作,会阻塞创建它的线程;
2.Runnable与Thread:
(1)java中有两种方式实现多线程,一种继承Thread类,一种是实现runnalbe接口
(2)Thread是java.lang包中定义的,一个类只要继承类Thread类同时复写了本类中的run方法 就可以实现多线程操作类,但是一个类只能继承一个父类,这是此方法的局限;
(3)在实际开发中很少使用Thread类,而是通过Runnable接口完成的;在使用Runnable定义的子类中没有start方法,只有Thread类才有,Thread类中有一个构造方法publicThread(Runnabletarger)此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动runnable实现多线程;
(4)在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优点:避免继承的局限,一个类可以继承多个接口,适合资源的共享;
其实Thread类也是Runnable接口的子类
注:Runnable只需要实现一个run接口,而且只有这个接口;
3.Looper:消息泵,不断从MessageQueue中抽取Message执行,因此一个MessageQueue需要一 个Looper;
Handler、Looper和MessageQueue简单的三角关系:Looper和MessageQueue一一对应,创建 一个Looper的同时,会创建一个MessageQueue,而Handler与它们的关系是,Handler会引用当前线程里特定的Looper和MessageQueue、一个Looper可以对应多个Handler;
注:getMainLooper(获取当前应用的主looper)、getThread(获取与该looper对应的线程)、 myQueue(返回与当前线程相关的Looper对象)、loop(运行对应线程的messagequeue)、quit(与loop对立)、prepare(用该looper对象初始化当前线程)
4.HandlerThread:android的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的 线程一般都会有一个Looper,HandlerThread就是Android提供的一个封装好的带有looper的线程类;(可以在Handler定义的子线程中操作Handler,不影响原来的Activity主线程,实现异步)
5.使用handler执行新进程:
(1)生成一个HandlerThread对象;
(2)在使用HandlerThread的getLooper方法前调用该类对象的start方法
(3)创建一个继承于Handler类的子类,实现一个参数为Looper对象的构造方法
6.Bundle:Android中的Bundle用于传递自定义的数据,在Bundle中已经封装好了简单数据类型 如String、int、float等(putInt、putString等等方法将这些不同的数据打包到Bundle对象中)
7.Message :
obtainMessage、setData、sendToTarget(把该message发送给Handler)、getData