参考 : 《Android进阶之光》
https://www.jianshu.com/p/ab77a2e83c52
java中的线程池框架,在android中一样可以使用,但android也有自己的多线程机制
- AsyncTask
这是一个异步任务类,含有三个泛型参数
三个参数的含义:
Params : 表示执行AsyncTask时需要传入的参数,可以在后台任务中使用
Progress : 表示后台任务执行的进度
Result : 表示后台任务返回结果的类型
如果不传具体的参数,三个参数也都可以为void
使用方法为用一个类继承AsyncTask并重写几个主要方法:
onPreExecute() : 运行在主线程
在异步任务执行前被调用
可用于进行界面初始化的操作
doInBackground(Params...params) : 在线程池中执行, 执行于onPreExecute之后,
用于完成一些耗时任务,执行过程中可以调用publishProgress(Progress...values)来更新界面信息
onProgressUpdate(Progress...values) : 运行在主线程中
用来响应 publishProgress()方法,通过参数对UI界面进行更新
onPostExecute(Result result) : 在主线程执行
在后台任务执行完毕后调用,用于进行一些收尾工作或更新界面UI
onCancelled() : 在主线程中调用,
在异步任务被取消时调用,用于UI界面的取消更新
execute(Params...params) : 在主线程中调用
表示开始异步任务,一个异步对象只能调用一次execute()方法
cancel(boolean) : 在主线程中调用, 表示停止一个异步任务
使用方法:
创建类 继承 AsyncTask, 重写几个主要方法。
要开始和结束任务,只需要调用新建类 对象的 execute() 和 cancel()方法即可
AsyncTask 部分代码
WorkRunnable 实现了Callable接口并实现了call 方法,在call方法中调用doInBackgroud执行任务,并最终调用
PostResult将结果发送出去。
FutureTask是一个可管理的异步任务,其实现了Runnable和Callable两个接口,所以可以包装它们。
这里将一个WorkRunnable 交给FutrueTask 进行包装,便于之后的使用。
当我们调用AsyncTask 的 execute 方法开始执行任务时,execute内部会调用 executeOnExecutor
这里首先执行了onPreExecute方法,之后将参数传给WorkRunnable对象,因为mFuture之前已经关联mWorker对象,
这里直接将mFuture丢给exec执行,(exec是由参数传进来的线程池)
执行mWorker的call方法最后会跳转到postResult方法,在PostResult方法中,会创建Message对象,之后调用
message.sendToTarget(),将message发送给Handler处理。
原文:https://www.cnblogs.com/xfdmyghdx/p/10627979.html