AsyncTask

1.什么是AsyncTask?

是一个轻量级的异步任务类,封装了Handler和线程池

2.关于Deprecated

当我准备开始阅读AsyncTask源码的时候,我在 AsyncTask的官方文档 发现了它在Android R(11.0)上已经被标记过时,官方更推荐开发者使用Kotlin的协程进行异步操作。

Google官方列举了以下把它标记为过时的原因,其实这也是AsyncTask一直以来都被诟病的地方:

  1. 容易导致内存泄漏

    由于AsyncTask的生命周期和Activity的生命周期不同步,并不会随着Activity的销毁而销毁,所以有时候会造成Activity的内存无法销毁,造成内存泄露

  2. 忘记回调

  3. 横竖屏切换导致崩溃

使用AsyncTask的最初目的是希望为UI线程开启一个后台线程,用于与之进行交互。因为常见对AsyncTask的使用是去执行一个耗时操作,并在结束后(AsyncTask.onPostExecute())更新UI。但是旋转屏幕,当前的Activity会被销毁然后重建,Activity重启后,此时AsyncTask对Actvity的引用是invalid,因为他指向的还是前一个没有转屏前的Activity,并不是重建后的Activity,So onPostExecute对重建后的Activity是没有意义的。这点尤其是在将AsyncTask作为Activity的内部类,AsyncTask会隐式应用当前Activity的时候给人制造困惑。
避免该问题的一个常规做法是,保留对AsyncTask的引用,该引用在配置更改之间持续,在重新启动时更新目标Activity。
因为AsyncTask的生命周期并不随着Activity的的销毁而销毁,导致在转屏的时候,转屏前AsyncTask的执行内容并没有传给转屏后的Activity,相当于AsyncTask的执行结果白白浪费了,

  1. 不同版本的AsyncTask的兼容问题

3.串行还是并行?

10.0是串行执行

线程run方法执行完后finally 中执行scheduleNext(取任务去执行)

怎样实现并行?

在AsyncTask内部创建了一个线程池,核心线程数是1,最大线程数是20,救急线程存活时间3s,这个线程池最终是进行异步任务执行的

execute()方法传入AsynTask的静态成员变量

4.AsyncTask设置了一个备用的线程池

以便常规执行任务的线程池拒绝执行任务时,还能保证任务队列里面的任务正常执行。

AIDL步骤:

服务端

1.1new AIDL FILE ,生成一个接口IBookManager.aidl (有操作book对象的方法)

1.2定义要操作的类Book,实现Parcelable接口,并在IBookManager.aidl import Book类

1.3自定义的Parcelable对象,必须创建一个和它同名的AIDL文件,并在其中声明它为parcelable类型Book.aidl。

2.Make Project ,SDK为自动为我们生成对应的Binder类:其中该接口中有个重要的内部类(抽象类)Stub ,继承了Binder 类,同时实现了IBookManager接口

3.服务端要创建一个Service用来监听客户端的连接请求。然后在Service中实现Stub 类,并定义接口中方法的具体实现。

客户端

1.将服务端工程中的aidl文件夹下的内容整个拷贝到客户端工程的对应位置下

2.连接服务端,获得上面实现了Stub的binder对象

3.服务端返回的Binder对象转换成AIDL接口所属的类型,接着就可以调用AIDL中的方法

Binder对象在服务端和客户端是共享的,是同一个Binder对象