前言:由于最近在做SDK的功能,需要设计线程池。看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到任务队列分析,最后自定义线程池。 1、概念 Android 中 ...
前言:由于最近在做SDK的功能,需要设计线程池。看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到任务队列分析,最后自定义线程池。
1、概念
Android 中的异步任务常用的一种方式是:Handler + Thread 组合来实现的。Thread 负责子线程的耗时操作,Handler 负责线程间的通信,用的最多的当属子线程和主线程通信。
Android 为了简化操作,提供了 AsyncTask 类来实现异步任务,并且轻松实现子线程和主线程间的通信。
2、AsyncTask的简单封装
三个参数代表的含义
- Params:第一个参数是启动任务传进来的参数;
- Progress:第二个参数是用来显示进度条的参数;
- Result:第三个参数是后台执行后返回的参数的类型。
package com.app;import android.os.AsyncTask;/** * Created by ${zyj} on 2016/8/2. */public class MyTask<T> extends AsyncTask<T , Integer , T> { private TaskListener taskListener ; public MyTask(){ } //执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。 @Override protected void onPreExecute() { if ( taskListener != null ){ taskListener.start(); } } //运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params...)的返回值。 @Override protected void onPostExecute(T t) { if ( taskListener != null ){ taskListener.result( t ); } } /** * 更新子线程进度,运行于UI线程 * @param values */ @Override protected void onProgressUpdate(Integer... values) {; if ( taskListener != null ){ taskListener.update( values[0] ); } } //运行与后台线程 @Override protected T doInBackground(T... ts) { if ( taskListener != null ){ return (T) taskListener.doInBackground( ts[0] ) ; } return null; } public MyTask setTaskListener(TaskListener taskListener ){ this.taskListener = taskListener ; return this ; } /** * 更新进度 * @param progress */ public void updateProgress( int progress ){ publishProgress( progress ); } public interface TaskListener<T>{ void start() ; void update( int progress ) ; T doInBackground( T t ); void result( T t ); } /** * 取消一个正在执行的任务 */ public void cancle(){ if ( !isCancelled() ){ cancel( true ) ; } }}
7、AsyncTask 串行处理任务 和 并行处理任务
在上面的代码演示中,执行任务用的都是 myTask.execute() , 这个默认是串行执行任务的。比如同一时刻有两个任务要处理,AsyncTask 会先执行第一个任务,等第一个任务执行结束,然后才会执行第二个任务。
在AsyncTask中还有一个并行处理任务的方法:executeOnExecutor( Executor exe , Params... params ) 。
下面是串行执行任务execute()的源码
通过看源码,发现其实串行执行任务也是调用了并行的方法 executeOnExecutor () , 只不过启用了一个默认的 sDefaultExecutor (sDefaultExecutor 是一个串行的线程池)。
有串行线程池,那么势必就有一个并行线程池 , 在AsyncTask里面源码里面定义了一个并行线程池: THREAD_POOL_EXECUTOR 。
可以看到并行 THREAD_POOL_EXECUTOR 是通过 new ThreadPoolExecutor() 来创建的
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, defaultHandler); }
一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。
原标题:Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池
关键词:Android
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。