AsyncTask原理详解

59 篇文章 0 订阅
33 篇文章 1 订阅

前言

基于源码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;
    }

这是一个线程的执行者,这里创建的时候传入了我们之前说明的那些参数,比如

核心线程数量,最大线程数量,线程活跃的时间,线程要执行的任务的队列,线程的创建工厂

未完待续…..

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值