一、AsyncTask的初始
AsyncTask是一种在后台执行任务然后将最新的进度和最后结果更新到UI线程的工具类。AsyncTask包含四个核心方法分别是:
onPreExecute() 在UI线程中、异步任务执行前调用。
doInBackground(Params… params) 在线程池中执行,用于执行异步任务,此方法通过publishProgress来更新进度
onProgressUpdate(Progress… values) 在UI线程中执行用于更新进度
onPostExecute(Result result) 异步任务完成后执行,在UI线程中执行
二、AsyncTask的限制条件:
1、必须在UI线程中进行初始
2、execute方法必须在UI线程中调用
3、AsyncTask在1.6以前是串行执行、在1.6到3.0是并行、3.0以后又是串行但可以通过exectuteOnExecutor来并行执行。
三、AsyncTask的工作原理
在新建AyncTaks对象的时建立如下对象:
public AsyncTask() {
mWorker = new WorkerRunnable<Params, Result>() {
public Result call() throws Exception {
mTaskInvoked.set(true);
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
//noinspection unchecked
return postResult(doInBackground(mParams));
}
};
mFuture = new FutureTask<Result>(mWorker) {
@Override
protected void done() {
try {
postResultIfNotInvoked(get());
} catch (InterruptedException e) {
android.util.Log.w(LOG_TAG, e);
} catch (ExecutionException e) {
throw new RuntimeException("An error occured while executing doInBackground()",
e.getCause());
} catch (CancellationException e) {
postResultIfNotInvoked(null);
}
}
};
}
当自定义的Task(如:DownLoadTask)执行execute方法时回调用executeOnExecutor()方法。在它的内部把它加入到SerialExector线程池。SerialExecutor线程池串行的每次只能执行一次。当真正执行时会调用THREAD_POOL_EXECUTOR来真正的执行。在执行中实际上执行的是mWorker 。在mWorker中回调用doInBackground(),会调用postResult方法。在postResult方法中会发送message 到UI线程执行最后的onPostExecute方法
四、HandlerThread
HandlerThread是一个内部开启了消息队列循环的Thread。
五、IntentService
IntentService是一个继承与Service的抽象类。它包含抽象方法handlerIntent();IntentService在onCreate时会新建一个HandlerThread用于无限的消息循环,同时还会新建内部类ServiceHandler.当启动Service时会通过ServiceHanlder的实例对象发送一个消息到HandlerThread。当HandlerThread接收到消息时就会调用handleIntent进行执行。当执行完毕后就会自动的停止服务。所以IntentService用于需要提高代码的优先级同时执行完毕后会自我停止的的情景。
六、Android中的线程池
Android中的线程池有以下优点:
1、可以重用线程池中的线程,避免新建和销毁带来的开销
2、可以避免大量的线程同时涌入照成线程拥堵。
3、方便管理线程。比如间隔执行。
七、ThreadPoolExecutor
Executor是一个代表线程池的接口。ThreadPoolExecutor是它的实现。新建一个ThreadPoolExecutor需要如下实例:
1、corePoolSize 表示核心线程的个数。一般情况下会一直存在
2、maximumPoolSize 表示非核心线程个数.当超过keepAliveTime时会被销毁
3、keepAliveTime 过期时间
4、unit 过期时间单位
5、workQueue 工作队列
6、threadFactory 线程工厂
ThreadPoolExecutor的线程的产生和销毁执行如下规律:
1、若核心线程为到达最大时,会启用核心线程
2、当workQueue未满但核心线程已到最大值时,会加入workQueue并阻塞
3、当workQueue已满则启动非核心线程
4、当非核心线程已满则抛出RejectExecutionException异常
所以综上所述:corePool–>workQueue–>maxiMumPool–>rejectedExecution
八、线程池的分类
通过Executors来创建。
1、FixedThreadPool 只有核心线程,没有非核心线程。所以线程池不会被回收,当所有核心线程都在执行时会出现等待。
2、CachedThreadPool 无核心线程、只有非核心线程,无缓存队列。当线程池都在执行时会创建新的线程并立即执行
3、ScheduledThreadPool 核心线程固定、非核心线程不固定。主要用于执行定时任务和固定周期任务
4、SingleThreadThreadPool 只有一个核心线程,用于确保所有任务都在同一线程中按顺序执行