使用AsyncTask--->对Handler 和Thread 进行了封装

来源:互联网 发布:戴眼镜的网络歌手男 编辑:程序博客网 时间:2024/05/09 11:37
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 界面的更新操作....




0 0