第十一章  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开发艺术探索学习笔记(十一)的更多相关文章

  1. Android开发艺术探索学习笔记(三)

    第三章  View的事件体系 3.1 View基础知识 3.1.1 什么是view View 是Android中所有控件的基类,是一种界面层的控件的一种抽象,它代表了一个控件. 3.1.2 View的 ...

  2. Android开发艺术探索学习笔记(十)

    第十章  Android的消息机制 面试中经常会被问到的一个问题:handler是如何在子线程和主线程中进行消息的传递的,这个问题通过了解Android的消息机制可以得到一个准确的答案. Androi ...

  3. Android开发艺术探索学习笔记(六)

    第六章 Android的Drawable  Drawable的优点:使用简单,比自定义view的成本要低:非图片类型的Drawable占用空间小,有利于减小APK安装包的大小. 6.1Drawable ...

  4. Android开发艺术探索学习笔记(四)

    第四章 View的工作原理 4.1初识ViewRoot和DecorView ViewRoot是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成 ...

  5. Android开发艺术探索学习笔记(一)

    第一章 Activity的生命周期和启动模式 1.1Activity的生命周期全面解析 1.1.1典型情况下的生命周期分析 (1)在两个Activity进行切换时,当前的Activity的onPaus ...

  6. Android开发艺术探索读书笔记——01 Activity的生命周期

    http://www.cnblogs.com/csonezp/p/5121142.html 新买了一本书,<Android开发艺术探索>.这本书算是一本进阶书籍,适合有一定安卓开发基础,做 ...

  7. Android开发艺术探索读书笔记——进程间通信

    1. 多进程使用场景 1) 应用某些模块由于特殊需求须要执行在单独进程中. 如消息推送,使消息推送进程与应用进程能单独存活,消息推送进程不会由于应用程序进程crash而受影响. 2) 为加大一个应用可 ...

  8. android开发艺术探索学习 之 结合Activity的生命周期了解Activity的LaunchMode

    转载请标明出处: http://blog.csdn.net/lxk_1993/article/details/50749728 本文出自:[lxk_1993的博客]: 首先还是先介绍下Activity ...

  9. android开发艺术探索读书笔记之-------view的事件分发机制

    View的点击事件的分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生后,系统需要把这个事件传递给一个具体的View,而这个过程就是分发过程. 分发过程主要由以下 ...

随机推荐

  1. Mac常用基本命令/常用Git命令

    Git地址: https://github.com/mancongiOS/command-line基本命令 目录/文件的操作 mkdir "目录名" 在当前路径下创建一个文件夹 m ...

  2. js 各种数值类型正则匹配检测

    随拿随用只js正则表达式,反正平时工作我是不写正则的,大神请自动绕行: 验证数字的正则表达式集验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数 ...

  3. PHP 简单处理--文件下载--文件上传

    文件下载部分 从 down 目录下下载,先获取目录下所有文件,再为每个文件添加download 信息,主要是文件名,后缀的关系. 分两部分,down_1.php 部分初始化,点击download 则跳 ...

  4. nodejs+express+jade给我baby做个小相册

    去年年底迎来了my little star.从此人生多了一个最重要的牵挂.生了宝宝全家人都太忙了.最近宝宝稍微大点了,终于有空可以研究下技术了.这是14年第一帖.废话不多了.开始吧 1.安装NTVS ...

  5. 在Linux上安装Oracle RAC 12 c(12.1) 虚拟机,一步一步向导

    Oracle RAC 12 c(12.1)在Linux上安装虚拟机,一步一步向导 今天我们将看到如何安装 12 c版本1 RAC(真正的应用程序集群)数据库2 Linux 64位的虚拟机 使用VMWa ...

  6. ubuntu修改hostname

    在Ubuntu系统中,快速查看主机名有多种方法:其一,打开一个GNOME终端窗口,在命令提示符中可以看到主机名,主机名通常位于“@”符号后:其二,在终端窗口中输入命令:hostname或uname – ...

  7. Studio for ASP.NET Wijmo:使用 C1Pager 对 DataList 控件分页

    Studio for ASP.NET Wijmo 控件值得称赞的一点是它不仅仅单独为 C1 控件而开发.还可以配合其他控件使用,也正体现了C1控件为提高开发人员工作效率而设计的宗旨.简单的举一个例子, ...

  8. sphinx使用随笔

    为什么需要进行全文搜索呢? 一个表中有a.b.c多个字段.我们使用sql进行like搜索的时候,往往只能匹配某个字段.或者是这样的形式:a LIKE “%关键词%”or b LIKE “关键词” 这样 ...

  9. .NET Core创建一个控制台(Console)程序

    .NET Core版本:1.0.0-rc2 Visual Studio版本:Microsoft Visual Studio Community 2015 Update 2 开发及运行平台:Window ...

  10. redis3.0 集群实战3 - java编程实战

    本文主要描述使用jedis进行redis-cluster操作   jedis jedis是redis官方推荐使用的java redis客户端,github地址为,https://github.com/ ...