AsyncTask的基本用法

AsyncTask是个抽象类,必须要创建一个子类去继承它.

继承时有三个泛型参数:

1. Params  : 在执行AsyncTask时需要传入的参数,用于在后台任务中使用.

2. Progress: 后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位.

3. Result : 当执行完毕,需要对结果返回,则使用其作为返回值类型.

 

简单的自定义AsyncTask这样写

class DownloadTask extends AsyncTask<Void,Integer,Boolean>{
...
}

  传入空数据,进度条以整数格式显示,返回值类型为布尔类型

上面的方法没有实质性的作用,还需要实现AsyncTask中的四个方法.

 

1.onPreExecute()

这个方法会在后台任务开始执行时调用,用来进行一些初始化操作,比如显示一个进度条对话框

 

2. doInBackground(Params...)

 

该方法内的代码都会在子线程中运行,我们要在这里处理所有耗时任务.任务一旦完成就

通过return语句返回,如果AsyncTask的第三个泛型参数指定的是Void,就可以不返回.

 

这个方法不能进行UI操作,如果需要更改UI元素,需要调用publishProgress(Progress...)

方法来完成.

 

3.onProgressUpdate(Progress...)

当后台任务调用了publishProgress(Progress...)方法后,这个方法很快会被调用,方法中

携带的参数是在后台任务传递过来的,这个方法可以对UI进行操作,利用参数中的数值就可以

对界面元素进行相应的更新.

 

4. onPostExecute(Result)

当后台任务执行完毕并通过return语句进行返回时,这个方法很快被调用.

返回的参数会被当做参数传递到此方法,利用返回的数据进行UI操作,比如提醒任务执行结果

关闭进度条对话框等.

 

示例代码:

 1 class DownloadTask extends AsyncTask<Void,Integer,Boolean>{
 2 
 3  @Override
 4   protected void onPreExecute(){ //初始化操作
 5     progressDialog.show()  
 6 }  
 7  @Override
 8  protected Boolean doInBackground(Void... params){  //子线程内处理耗时操作,
 9      try{
10          while(true){
11              int downloadPercent = doDownload();
12              publishProgress(downloadPercent);
13              
14              if(downloadPercent >= 100){
15                  break;
16              }
17              
18          }catch(Exception e){
19              return false;
20          }
21          return true;
22      }
23


24      @Override
25      protected void onProgressUpdate(Integer... values){ //调用publishProgress()方法后调用改方法,用来更新UI
26          progressDialog.setMessage("当前下载进度:"+values[0]+"%");
27      }
28      
29      @Override
30      protect void onPostExecte(Boolean result){ //后台任务执行完后执行的方法.可以对结果进行判断然后控制UI显示结果.
31          progressDialog.dismiss();
32          
33          if(result){
34              Toast.makeText(context,"下载成功",Toast.LENGTH_SHORT).show();
35          }else{
36              Toast.makeText(context,"下载失败",Toast.LENGTH_SHORT).show();
37          }
38      }
39  }
40 
41   new DownloadTask().execute();  //执行

 

posted @ 2014-10-07 16:53  vwa  阅读(263)  评论(0)    收藏  举报