AsyncTask
1.什么是AsyncTask?
是一个轻量级的异步任务类,封装了Handler和线程池
2.关于Deprecated
当我准备开始阅读AsyncTask源码的时候,我在 AsyncTask的官方文档 发现了它在Android R(11.0)上已经被标记过时,官方更推荐开发者使用Kotlin的协程进行异步操作。
Google官方列举了以下把它标记为过时的原因,其实这也是AsyncTask一直以来都被诟病的地方:
容易导致内存泄漏
由于AsyncTask的生命周期和Activity的生命周期不同步,并不会随着Activity的销毁而销毁,所以有时候会造成Activity的内存无法销毁,造成内存泄露
忘记回调
横竖屏切换导致崩溃
使用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的执行结果白白浪费了,
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对象
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!