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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值