AsyncTask的实现原理,也是基于异步消息处理机制的.
(1)AsyncTask是一个抽象类, 我们在使用的时候, 必须创建一个子类来继承它. 在继承的时候,我们可以为AsyncTask指定三个泛型参数....
1.params 在执行AsyncTask 时候需要传入参数, 可用于后台任务中的使用.
2. progress
后台执行任务时候, 如果需要在界面上显示当前的进度, 则使用这里指定的泛型作为进度单位....
3.Result
当任务执行完毕后, 如果需要对结果进行返回, 则使用这里制定的泛型作为返回值类型,
(2) 我们还学要重写经常使用的四个方法
1. onPreExcute( ) ---主线程中
这个方法,会在后台任务执行之前调用, 用于进行一些界面上的初始化操作----->例如: 显示一个进度条对话框
2. doInBackground()----子线程中
这个方法中的所有的代码,都会在子线程中运行, 我们可以在这里面去处理所有的耗时的操作, 任务一旦完成,我们可以通过return 来 返回任务执行的结果,
当然,如果AsyncTask的第三个泛型参数指定为 void 时候, 我们可以不返回任何执行结果..
=================================================================
接下来问题来了, 我们在这个方法中处理了耗时操作,例如: 联网, 加载大数据, 图片等 ,
那么,这些处理结果,怎么能够被主线程调用,---->如何更新UI 勒?
例如: 我们要反馈当前任务执行的进度,如果更新这个UI 变化勒?
我们可以调用publishProgress(Progress ..)方法来完成...===>该方法一旦被调用,系统将会很快调用另外一个方法: onProgressUpdate(Pregress ..),且看第三个...
3. onProgressUpdate(Pregress ..) ------主线程中
当在后台任务中调用了publishProgress(Progress ..)方法后, 这个方法也很快会被调用,,
方法中携带的参数就是在后台任务中传递过来的.
这个方法可以对UI 进行操作, 利用参数中的数值, 就可以对界面的元素 进行相应的更新...
4. onPostExcute(Result)
当后台任务执行完毕并通过return 返回执行的结果时候, 这个方法会很快被调用, 返回的数据会作为参数传递到这个方法中, 我们就可以利用数据对UI 进行一些操作,=====>例如: 提醒任务易经结束, 关闭进度条对话框...
总结一下:
在任务执行前, 首先会走 onPreExcute( )方法, 我们可以设置界面显示开始任务的对话框,或者进度条显示的操作
然后:走doInBackground()方法
-------> 后台任务: 一系列耗时操作是在doInBackground()方法中执行的,
在这个doInBackground() 方法执行的过程中, 如果我们如要与UI 界面交互起来---->例如: 让UI 界面做一些更新,
让进度条更新进度---------->要调用publishProgress() 方法...
然后走: 如果调用了publishProgress() 方法, 就会走onProgressUpdate() 方法,做UI界面的一些更新操作
---------> 接下来, 在整个子线程中的任务完成后,,并且返回了执行结果,
走onPostExcute(Result)方法,===>我们通过参数Result 里面的数据, 执行对UI 界面的更新操作....