一,总体描述
整个流程就相当于车队
1,Message
Message就是消息,传递的数据分成多个组,由消息来一部分一部分的传送。相当于车子,运载货物(消息、数据)。
它的几个属性不难理解,获取Message对象的时候不要new构造方法,用obtain,因为本身队列里面有message,没有的话会自动创建。里面message的值为10,就 是说会循环利用,looper起作用。或者Handler里面有相应的方法获取Message对象
2,MessageQueue
由Looper管理,可以想象下传送的消息有很多,要确保它们之间的顺序,因此要用MessageQueue(队列)来管理,各个消息按照顺序排列,先进先出,那么就不会 数据错乱。
3,Handler
负责发送,处理与线程消息队列相关的message或者Runnable objects。每个Handler跟线程以及MessageQueue是一一对应的,创建的时候回自动关联。Handler 发送消息或者Runnable对象给队列,或者处理Looper从队列中取出的消息或者Runnable对象。
两个主要用法:
1,调度message跟Runnable objects,将来处理。
2,发送message或者Runnable objects给别的线程。可即时发送也可以延时之后发送。
Handler的方法:都不太难理解,很多方法都是参数的变化而已,意思还是一样的。参数的不同只是把原来的变量直接就放到参数哪里而已。
注意其中post类型的方法都是用于Runnable 对象的发送处理的,而send类型用于message发送处理。
Handler.Callback:里面包含handleMessage方法,必须实现的。
4,Runnable Objects
定义的一组操作,以消息的形式发送给另外一个线程,接受到这个消息的线程负责处理该组操作。
5,Looper
执行消息的循环。每个线程只有一个Looper,它负责管理MessageQueue,从MessageQueue中去粗消息并且交给Handler处理。
线程本身是没有循环的,要通过Looper实现。用静态方法prepare()创建Looper对象,在这里会跟线程对应。之后调用静态方法loop()方法来启动,可以调用 quit()来停止。
二,实现
1,UI主线程默认有一个Looper,但是在子线程中要先创建Looper,注意Lopper对象的创建方法。
2,注意Message对象的获取