---恢复内容开始---

一、Android线程的形态

(一)AsyncTask解析

AysncTask简介:①、实现上封装了Thread和Handler   ②、不适合进行特别耗时的后台任务

AysncTask使用:android AsyncTask 的使用(转载)

AysncTask的使用限制:①、AysnTask类必须在主线程中加载。(根据后面的源码进行解析)  ②、对象必须在主线程创建  ③、execute方法必须在UI线程调用

④、一个AsyncTask对象只能执行一次execute(),否则会报错   ⑤、在Andorid3.0之后采用串行执行任务(串行:表示排队执行,比如说我开启了10个AysncTask下载,串行表示我只能一个一个执行),但是我们任可以通过executeOnExecutor()执行并行任务(并行:表示我能够10个AysncTask一起执行)

AsyncTask的工作原理

①、首先从AsyncTask的execute()方法开始->调用executeOnExecutor()

②、查看executeOnExecutor()(P395 ①)

1、sDefalutExecutor对象表示:是一个串行的线程池(该对象稍后解析)

2、先执行AsyncTask的onPreExecute()方法

3、之后调用sDefaultExecuotr.execute(mFuture);

解析mFuture:为FutureTask类,首先系统会将AsyncTask的Params参数封装为FutureTask类,FutureTask是一个并发类(什么意思),这里充当了Runnable的作用。

③、分析sDefaultExecutor类(P396 ①)

1、发现sDefaultExecutor是SerialExecutor类,SeriralExecutor类是一个私有的静态类

2、在看下execute():将mFuture插入到mTask的队列中去,并判断当前有没有正在活动的AsyncTask任务,没有的话就调用scheduleNext()执行下一个AsynacTask()任务。

当一个AsynacTask执行完会继续执行下一个。

④、AsyncTask中有两个线程池(SerialExecutor和THREAD_POOL_EXECUTOR)和一个Handler(InternalHandler)。

SerialExecutor(用于线程的排队),THREAD_POOL_EXECUTOR(用于线程的真正执行),InternalHandler(将线程环境切换为UI环境)

⑤、当执行的时候,调用Future.run()方法中会调用mWorker的call()方法(P397 ①)

在call()方法中:首先将mTaskInvoked.set(true)表示该任务被调用过了,之后调用doInBackground()->在调用postResult(参数为doInBackground的返回值)

⑥、查看postResult()的实现(P397 ①)

发现会向sHandler发送一个MESSAGE_POST_RESULT消息

⑦、查看sHandler的定义(P398 ①)

sHandler是一个静态的Handler对象,且为了能够将执行环境切换到主线程,所以必须在主线程下创建该Handler。

sHandler收到MESSAGE_POST_RESULT消息后,就会调用AsyncTask的finish()方法

⑧、AsyncTask的finish()方法(P398 ②)

这是一个判断语句:当AsyncTask被取消执行,则会调用onCancelled()。否则调用onPostExecute()所以doInBackground返回的结果给onPostExecute()且该方法是在主线程中执行的。

关于AysncTask的串行与并行

调用execute()表示,串行执行

调用executeOnExecutor()表示,并行执行

(二)、HandlerThread

作用:继承了Thread,可以使用Handler的Thread,不用自己创建Looper,允许在Thread中创建Handler

解析

①、查看run()方法(P402 ①)

在其中创建一个Looper,其中有OnLooperPrepared()这个方法中用来加载Handler是最合适的。

与普通Thread的区别,需要使用Handler来通知HandlerThread来执行一个任务。而普通的Thread就是在run()方法中执行一个耗时任务

:因为启动了Looper所以必须使用Looper.quit()方法将该线程停止。

主要使用的场景是在IntentService中

(三)、IntentService

简介:IntentService是一个特殊的Service,继承了Service类,并且自己本身还是一个抽象类,所以还必须继承IntentService,才能使用IntentSeravice。

作用:IntentService可用于执行,耗时的后台任务,当任务执行完成的时候会自动停止。

解析:

①、IntentService封装了HandlerThread和Handler,可以从onCreate()方法(P403 ①)。

当IntentSerivce第一次启动的时候其onCreate()方法就会被调用一次,这样handler发送的消息就可以在HandlerThread中执行。

②、当每次启动IntentService时,onStartCommand()方法都会被调用,在这个地方处理Intent发送过来的事件。->调用onStart()

③、onStart()方法的实现(P404 ①)

发现向mServiceHandler发送了一条信息,该信息会在HandlerThread中处理。mServiceHandler收到消息后,会调用onHandleIntent()。

④、当完成调用onHandleIntent()方法时,IntentService会尝试调用stopSelf()方法停止服务。(P404 ②)

二、Android中的线程池

(一)、ThreadPoolExecutor介绍

ThreadPoolExecutor使用介绍

(二)、AysncTask的ThreadPoolExecutor配置

(三)、其他种类的线程池

Android的线程和线程池的更多相关文章

  1. 《Android开发艺术探索》读书笔记 (11) 第11章 Android的线程和线程池

    第11章 Android的线程和线程池 11.1 主线程和子线程 (1)在Java中默认情况下一个进程只有一个线程,也就是主线程,其他线程都是子线程,也叫工作线程.Android中的主线程主要处理和界 ...

  2. 【转】[Android实例] Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

    android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解. [size=1.8em]Handler+Runn ...

  3. 《android开发艺术探索》读书笔记(十一)--Android的线程和线程池

    接上篇<android开发艺术探索>读书笔记(十)--Android的消息机制 No1: 在Android中可以扮演线程角色的有很多,比如AsyncTask.IntentService.H ...

  4. [Android实例] Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

    android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解. [size=1.8em]Handler+Runn ...

  5. 《Android开发艺术探索》第11章 Android的线程和线程池

    第11章 Android的线程和线程池 11.1 主线程和子线程 (1)在Java中默认情况下一个进程只有一个线程,也就是主线程,其他线程都是子线程,也叫工作线程.Android中的主线程主要处理和界 ...

  6. Android中线程和线程池

    我们知道线程是CPU调度的最小单位.在Android中主线程是不能够做耗时操作的,子线程是不能够更新UI的.在Android中,除了Thread外,扮演线程的角色有很多,如AsyncTask,Inte ...

  7. Android线程与线程池

    引言 在Android中,几乎完全采用了Java中的线程机制.线程是最小的调度单位,在很多情况下为了使APP更加流程地运行,我们不可能将很多事情都放在主线程上执行,这样会造成严重卡顿(ANR),那么这 ...

  8. android线程及线程池

    众所周知,在UI系统中进行一些耗时操作,都会导致卡顿现象,因为一次刷新在16ms,如果当次操作过了这个时间,那么用户就能感觉到明显的卡顿,甚至引起ANR . 对于这种情况,一般都是再起一个线程,进行一 ...

  9. 【多线程】Android多线程学习笔记——线程池

    Java线程池采用了享元设计模式,在系统中维持一定数量的线程,用于处理异步或并发需求,在平时处理异步或并发任务时被广泛使用.这里基于JDK1.8和Android28来整理一些关于线程池的知识点. 一. ...

  10. android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法

    adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中 ...

随机推荐

  1. Lucene学习总结之一:全文检索的基本原理

    一.总论 根据http://lucene.apache.org/java/docs/index.html 定义: Lucene 是一个高效的,基于Java 的全文检索库. 所以在了解Lucene之前要 ...

  2. 关于反射中获取Fields,method,Construts简单介绍

    * getFields()与getDeclaredFields()区别:getFields()只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.getDeclared ...

  3. 基于VMware的eCos环境编译redboot(脚本配置redboot)

    基于VMware的ecos,redboot及hello world(1)安装请参照[[ecos学习2]wmware运行redboot[方法二]--图形实现配置 ] (2)修改内存布局文件:~/i386 ...

  4. Python之路第十三天,高级(7)-详述数据库一对多,多对多表关系的设计以及如何查询

    一对多表设计和查询方法 #!/usr/bin/env python3 # Author: Zhangxunan from sqlalchemy import create_engine from sq ...

  5. 视听说加速器--AHK辅助工具

    大学有视听说这门课,看起来这门课设计得非好,可是对大多数人来讲却不能按时完成.到了最后都要抓紧提速,上网找答案,辛苦的抄,有“聪明者”便找加速器来做. 我也是赶着做的人之一.抄答案太累,加速器太卡,还 ...

  6. Multi-Channel MAC for Ad Hoc Networks: Handling Multi-Channel Hidden Terminals Using A Single Transceiver

    MAC协议 2004 这是一个单纯的Multi-Channel Ad Hoc场景,多信道,但不是DSA.没有PU,只是多信道利用问题,相对传统Ad Hoc,要解决的就是1)信道访问(如何使用多个信道) ...

  7. 查看mysql 服务器上的连接进程

    SHOW PROCESSLIST #展示全部的连接进程 select * from information_schema.processlist where  db='qwuliu' #可以进行筛选查 ...

  8. Linux系统编程(6)——文件系统

    计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数 ...

  9. 一 VC2008环境中ICE的配置

    VC2008环境中ICE的配置 ICE 3.4.0的下载页面 http://www.zeroc.com/download_3_4_0.html 环境变量配置  1.Ice-3.4.0安装到c:\Ice ...

  10. SDK调试出错小技巧=。=

    学习Unity小伙伴完全不懂Android编程抓错误是很困难的..... 1. 使用UnityPlayer.UnitySendMessage(); 发送到Unity使用OnGUI显示错误 2. 直接在 ...