前言
基于源码7.0讲解,所以如果您发现说的有些地方和您理解的不一致,请先确认是否是源码改动引起的,如果不是,请留言
首先丢出一个简单的小例子
我们执行一个任务 任务的参数是字符串String 如何需要跟进任务的进度,那么任务进度我们用Integer表示
任务返回的结果我们使用String上述的参数、进度和结果的类型其实你们喜欢用什么类型都是阔以的 不一定照着博主的来
xml(里面就一个按钮)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.cxj.demo.MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="clickView"
android:text="点我" />
</RelativeLayout>
Activity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//按钮点击事件
public void clickView(View view) {
AsyncTask<String, Integer, String> at = new AsyncTask<String, Integer, String>() {
@Override
protected String doInBackground(String... params) {
//循环输出任务的参数信息
for (int i = 0; params != null && i < params.length; i++) {
System.out.println("任务执行第" + (i + 1) + "个参数为:" + params[i]);
}
//随便返回一个信息
return "success";
}
};
//执行任务,带上两个参数
at.execute("hello", "world");
}
}
先看结果
代码非常简单,博主对于重要的地方进行讲解
public abstract class AsyncTask<Params, Progress, Result>{
............
}
AsyncTask类上使用了三个泛型,就是为了创建AsyncTask的时候,我们能根据具体的情况创建出符合情况的对象
比如你的任务需要参数为Integer类型的,那么你创建AsyncTask对象的时候,第一个泛型指定为Integer
比如你任务执行的结果是一个User,那么你就把第三个泛型写成User即可
类中重要字段讲解
1.内部有一个成员变量,获取了设备的cpu的个数
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
2.内部核心线程个数
CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
这里对于这段代码的完全解释就是,核心线程的个数的区间是[2,4]
3.最大线程数量
MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
4.每一个线程空闲后等待的时间为30秒,时间到了就会被停止
KEEP_ALIVE_SECONDS = 30;
5.内部还有一个创建线程的工厂类
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
}
};
这里就是要给线程的创建工厂,而且给每一个新创建的线程都带上了
“AsyncTask #” 这个标志,AtomicInteger 是一个可以自增的整型变量
6.任务队列
private static final
BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(128);
这里是一个消息队列,因为整个类是设计为了执行任务的,所以这个用于工作的消息队列当然是存放任务的拉,最大的容量是128个哦,这里一定要记住,面试的时候别慌,就是干
7.任务执行者(这个类在多线程编程中常见,也可以认为是线程任务执行者)
public static final Executor THREAD_POOL_EXECUTOR;
static {
ThreadPoolExecutor threadPoolExecutor =
new ThreadPoolExecutor(
CORE_POOL_SIZE,
KEEP_ALIVE_SECONDS,
TimeUnit.SECONDS,
sPoolWorkQueue,
sThreadFactory
);
threadPoolExecutor.allowCoreThreadTimeOut(true);
THREAD_POOL_EXECUTOR = threadPoolExecutor;
}
这是一个线程的执行者,这里创建的时候传入了我们之前说明的那些参数,比如
核心线程数量,最大线程数量,线程活跃的时间,线程要执行的任务的队列,线程的创建工厂
未完待续…..