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();
}
}