Android AsyncTask異步操作分析

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章