Android开发艺术探索学习笔记(十一)
第十一章 Android的线程和线程池
从用途上来说,线程分为子线程和主线程,主线程主要处理和界面相关的事情,而子线程往往用于执行耗时的操作。AsyncTask,IntentService,HandlerThread都可以扮演线程的角色。
AsyncTask封装了线程池和Handler,主要是为了方便开发者在主线程中更新UI。
HandlerThread是一种具有消息循环的线程,在它的内部可以使用Handler。
IntentService是一个服务,系统对其进行了封装,使其可以更方便的执行后台任务,IntentService内部采用了HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出,由于其优先级较高,不容易被系统杀死。
11.1 主线程和子线程
主线程-处理界面交互相关的逻辑,运行四大组件以及处理它们和用户的交互。
子线程-执行耗时的任务,比如网络请求,IO操作等。(3.0开始网络访问不能在主线程中,否则NetworkOnMainThreadException)
11.2 Android中的线程形态
11.2.1 AsyncTask
一种轻量级的异步任务类,在线城池中执行后台任务,然后把执行的君度和最终的结果传递给主线程并在主线程中更新 UI,不建议用于执行特别耗时的任务。
类声明如下:
public abstract class AsyncTask<Params,Progress,Result>
Params:参数类型;
Progress:后台任务执行进度类型;
Result:后台任务的返回结果类型。
以上参数如果不需要传递可以用Void代替。
四个核心方法:
(1)onPreExecute()——初始化的准备工作,主线程中执行;
(2)doInBackground(Params...params)——执行异步任务,线程池中执行,执行过程中通过publishProgress方法更新任务进度,publishProgress方法会触发onProgressUpdate();
(3)onProgressUpdate(Progress...values)——更新任务进度,主线程中执行。
(4)onPostExecute(Result result)——异步任务返回结果,主线程执行。
注意:...在java中表示参数不固定,数组型参数。
执行异步任务通过以下方法:
new MyAsyncTask().execute(url1,url2,url3);
AsyncTask使用的限制条件:
(1)AsyncTask的类必须在主线程中加载(默认);
(2)AsyncTask对象必须在主线程中创建;
(3)execute方法必须在主线程中调用;
(4)不要直接调用四种核心方法;
(5)一个AsyncTask对象只能执行一次,即只能调用一次execute方法,否则会报运行时异常。
11.2.3 HandlerThread
HandlerThread继承自Thread,是一种可以使用handler 的Thread,具体使用场景是IntentService。
11.2.4 IntentService
IntentService一种特殊的Service,封装了HandlerThread和Handler,用于执行后台耗时的任务,任务执行后会自动停止;比较适合执行一些高优先级的后台任务。
11.3 Android中的线程池
线程池的优点:
(1)重用线程池中的线程可减少性能开销;
(2)能有效控制线程池的最大并发数,避免大量线程之间因互相抢占系统资源而导致的阻塞现象。
(3)能够对线程进行简单的管理,提供定时执行以及指定间隔循环执行等功能。
Android 中的线程池都是直接或者间接通过配置ThreadPoolExecute来实现的。
11.3.1 ThreadPoolExecute
线程池的构造方法:
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TileUnit unit,BlockingQueue<Runnable> workQueue,THreadFactory threadFactory)
corePoolSize:核心线程数;
maximumPoolSize:最大线程数;
keepAliveTime:非核心线程闲置时的超时时长;
unit:keepAliveTime的时间单位,如TimeUnit.MILLISECONDS(毫秒),TimeUnit.SECONDS(秒),TimeUnit.MINUTES(分钟)
workQueue:线程池中的任务队列。
threadFactory:线程工厂,用于为线程池创建新线程。
11.3.2 线程池的分类
(1)FixedThreadPool——只有核心线程;
(2)CachedThreadPool——只有非核心线程,适合执行大量的耗时较少的任务;
(3)ScheduledThreadPool——核心线程数量固定,非核心线程数量无限制,用于执行定时任务和具有固定周期的重复任务;
(4)SingleThreadExecutor——只有一个核心线程,解决线程同步问题。
Android开发艺术探索学习笔记(十一)的更多相关文章
- Android开发艺术探索学习笔记(三)
第三章 View的事件体系 3.1 View基础知识 3.1.1 什么是view View 是Android中所有控件的基类,是一种界面层的控件的一种抽象,它代表了一个控件. 3.1.2 View的 ...
- Android开发艺术探索学习笔记(十)
第十章 Android的消息机制 面试中经常会被问到的一个问题:handler是如何在子线程和主线程中进行消息的传递的,这个问题通过了解Android的消息机制可以得到一个准确的答案. Androi ...
- Android开发艺术探索学习笔记(六)
第六章 Android的Drawable Drawable的优点:使用简单,比自定义view的成本要低:非图片类型的Drawable占用空间小,有利于减小APK安装包的大小. 6.1Drawable ...
- Android开发艺术探索学习笔记(四)
第四章 View的工作原理 4.1初识ViewRoot和DecorView ViewRoot是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成 ...
- Android开发艺术探索学习笔记(一)
第一章 Activity的生命周期和启动模式 1.1Activity的生命周期全面解析 1.1.1典型情况下的生命周期分析 (1)在两个Activity进行切换时,当前的Activity的onPaus ...
- Android开发艺术探索读书笔记——01 Activity的生命周期
http://www.cnblogs.com/csonezp/p/5121142.html 新买了一本书,<Android开发艺术探索>.这本书算是一本进阶书籍,适合有一定安卓开发基础,做 ...
- Android开发艺术探索读书笔记——进程间通信
1. 多进程使用场景 1) 应用某些模块由于特殊需求须要执行在单独进程中. 如消息推送,使消息推送进程与应用进程能单独存活,消息推送进程不会由于应用程序进程crash而受影响. 2) 为加大一个应用可 ...
- android开发艺术探索学习 之 结合Activity的生命周期了解Activity的LaunchMode
转载请标明出处: http://blog.csdn.net/lxk_1993/article/details/50749728 本文出自:[lxk_1993的博客]: 首先还是先介绍下Activity ...
- android开发艺术探索读书笔记之-------view的事件分发机制
View的点击事件的分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生后,系统需要把这个事件传递给一个具体的View,而这个过程就是分发过程. 分发过程主要由以下 ...
随机推荐
- Fiddler进行手机抓包
测试设备:Windows8.1,Android 4.0.4山寨Android手机 网络环境:电信校园网,Wifi环境 测试工具:Fiddler4 完全参考了:http://www.jb51.net/s ...
- Mysql学习笔记(八)索引
PS:把昨天的学习内容补上...发一下昨天学的东西....五月三日...继续学习数据库... 学习内容: 索引.... 索引的优点: 1.通过创建唯一索引,可以保证数据库每行数据的唯一性... 2.使 ...
- js-条件语句、循环语句
一. 常见条件语句 if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if... ...
- 一个简单的3DTouch、Peek和Pop手势Demo,附github地址
参考文章:http://www.jianshu.com/p/74fe6cbc542b 下载链接:https://github.com/banchichen/3DTouch-PeekAndPopGest ...
- Redis设计与实现-主从、哨兵与集群
主从 从机使用slaveof 命令来复制主机的缓存数据,包括同步sync与命令传播两个操作: 从机同步sync命令给主机,主机收到后执行需要耗费大量cpu.内存和磁盘IO资源的bgsave命令来生成r ...
- Week3 博客阅读感想和代码复审
一.关于博客阅读感想 阅读了十多篇老程序员(大多在计算机相关行业工作超过10年)关于自身经历的博客,很有感触.这里一方面总结一下看博客的收获,另一方面写点自己的感受. 首先,这些博客不少涉及到了两大类 ...
- SQL Server 2008 FILESTREAM特性管理文件
在SQL Server 2008中,新的FILESTREAM(文件流)特性和varbinary列配合,你可以在服务器的文件系统上存储真实的数据,但可以在数据库上下文内管理和访问,这个特性让SQL Se ...
- .net中以传引用的方式 向方法中传参数
CLR(CommonLanguageRuntime)公共语言运行时,允许以传引用而非传值的方式传递参数.在C#中,这是用关键字 out 和ref来做到的. 从CLR角度来看,这两个关键字没什么区别,生 ...
- Unity中简单使用Opengl
简介 由于项目特殊需求,需要在unity中使用一些OpenGL的东西来绘制图形(PS:其实就是有一个拖尾算法只有OpenGL版本~~~懒得改了,直接在unity中使用OpenGL算了).所以琢磨咯下如 ...
- jQuery实现表格拖动排序
原理就是利用mousedown.mouseover.mouseup事件实现拖动,并用Ajax实现保存结果. JS代码如下: <!--题目调序功能--> <script type=&q ...