AsyncTask是Android平台自己的异步工具,融入了Android平台的特性,让异步操作更加的安全,方便和实用。
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String,Integer等。
1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记,运行在UI线程。
3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。 在执行过程中可以调用publishProgress(Progress... values)来更新进度信息,运行在后台线程。
4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上,
运行在UI线程。
5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上,
运行在UI线程。
在使用的时候,需要注意:
1.创建异步TASK的时候只能在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例execute只能执行一次,如果执行第二次将会抛出异常。
btnDownLoad.setOnClickListener( new OnClickListener() {
public void onClick( View v )
{
// TODO Auto-generated method stub
TestTask mTestTask = new TestTask();
mTestTask.execute( 100 );
}
} );
class TestTask extends AsyncTask<Integer , Integer , Integer>
{
@Override
protected Integer doInBackground(
Integer ... params )
{
// TODO Auto-generated method stub
Log.v( TAG , "TestTask - doInBackground" );
for( int i = 0 ; i <= 100 ; i++ )
{
mProgressBar.setProgress( i );
publishProgress( i );
if( isCancelled() )
{
return DOWNLOAD_TYPE_FAIL;
}
try
{
Thread.sleep( params[0] );
}
catch( InterruptedException e )
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return DOWNLOAD_TYPE_SUCESSES;
}
@SuppressLint( "ShowToast" )
@Override
protected void onPostExecute(
Integer result )
{
// TODO Auto-generated method stub
Log.v( TAG , "TestTask - onPostExecute + result = " + result );
switch( result )
{
case DOWNLOAD_TYPE_FAIL:
Toast.makeText( mContext , "下载失败" , Toast.LENGTH_SHORT ).show();
showProgressTextView.setText( "下载失败" );
break;
case DOWNLOAD_TYPE_SUCESSES:
Toast.makeText( mContext , "下载完成" , Toast.LENGTH_SHORT ).show();
showProgressTextView.setText( "下载完成" );
break;
}
mProgressBar.setProgress( 0 );
super.onPostExecute( result );
}
@Override
protected void onPreExecute()
{
// TODO Auto-generated method stub
Log.v( TAG , "TestTask - onPreExecute" );
super.onPreExecute();
}
@Override
protected void onProgressUpdate(
Integer ... values )
{
// TODO Auto-generated method stub
Log.v( TAG , "TestTask - onProgressUpdate" + values );
showProgressTextView.setText( "已下载:" + values[0].toString() + "%" );
super.onProgressUpdate( values );
}
@Override
protected void onCancelled(
Integer result )
{
// TODO Auto-generated method stub
Log.v( TAG , "TestTask - onCancelled + result = " + result );
switch( result )
{
case DOWNLOAD_TYPE_FAIL:
Toast.makeText( mContext , "下载失败" , Toast.LENGTH_SHORT ).show();
showProgressTextView.setText( "下载失败" );
break;
}
super.onCancelled( result );
}
@Override
protected void onCancelled()
{
// TODO Auto-generated method stub
Log.v( TAG , "TestTask - onCancelled" );
super.onCancelled();
}
}