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(); //执行

浙公网安备 33010602011771号