一、背景
Android中截面的更新必须要在UI线程中进行,但是向轮询器和网络请求这些比较耗时的操作如果放在主线程中执行会造成截面的卡顿,用户体验不友好,这时我们可以放在子线程中去执行这些耗时的操作,然后在通过消息传递的机制把消息传到主线程中去执行更新UI的操作
谷歌现阶段提供了Handler和线程池来实现这些操作,而且目前来说已经有很多基于这些已经封装好的框架,像Asynctask,以及现在比较流行的RxJava都是处理异步任务,然后放在主线程中更新UI的,但是其本质都是利用线程和Handler机制来实现的
二、Handler
Handler是目前谷歌提供的唯一一个线程间通信的机制
使用
说起Handler机制来,首先想到的就是Handler,Looper,Message,MessageQueue
Handler:负责消息的发送,在哪个线程中声明就属于哪个线程
Message:handler发送的消息
MessageQueue:消息队列,存放消息
Looper:轮询器,负责在消息队列中轮询消息,然后交给handler处理
三、线程
大家都知道怎么创建子线程1.实现Runnable接口;2.new Thread,但是当项目中有很多子线程的时候就不利于我们管理,如果使用完的子线程不能及时回收会容易造成内存溢出等一系列问题,不过谷歌提供给我们了线程池的概念,用来维护项目中子线程
基本使用ThreadPoolExecutor(父类)
1.创建线程池,在构造方法中可以指定核心线程大小,非核心线程大小,线程存活时间,时间单位,队列等内容
2.创建好的线程通过线程池的.execute方法放在线程池中维护
基本的使用方法就是以上了,还要注意的是线程的队列,类似于List集合,线程池也分为数组和链式,其原理可以参考ArrayList和LinkedList
谷歌为了满足不同的需求也为我们封装了几种不同类型的线程池
1.FixedPoolExecutor核心线程数量固定
2.SingleThreadExecutor核心线程为1的线程池
3.CachedThreadPool根据线程情况调整线程的数量
4.ScheduledThreadPool定时执行任务的线程池
从名字上也可以知道这几种线程的应用场景,可以根据业务需求选择,其使用方法也是大同小异,就不一一写了,看Api就可以
四、小结
这就是Android中消息异步处理的根本,不过现在应用的开发很少会这么做了,一般都会使用成型的框架,之前AnsyTask比较多,现在RxJava也火起来了
以上就是自己对异步消息处理的理解,只是偏宏观的,没有详细的列出方法和参数等的使用,有不足或不对之处还请多多指教