AsyncTask简介与使用

如如转载,请注明出处谢谢!http://blog.csdn.net/andysun1992

一、简介 

AsyncTask 是一个执行异步任务的方法,其实它本身是一个线程池。它允许在后台执行耗时操作,并可以把耗时操作产生的数据结果来更新UI线程(如果你不理解这句话的意思,详情见上一篇)。是一个简单的实现多线程之间的通信(安卓中的IPC)的方法。简单来说,它的使用要理解“三个参数,四个方法(步骤)”。

1、三个Object类型的泛型参数<params,progress,result>。

A、第一个参数params是异步任务开始的时候你要传递进去的参数,可以叫他启动参数。

B、第二个参数progress是任务执行过程中的进度情况。

C、第三个参数result是异步任务完成时交给主线程的返回结果

2、四个方法 onPreExecute()、doInBackground()、onProgressUpdate()、onPostExecute()。

A、onPreExecute()是在执行异步任务之前在主线程里面要执行的操作,比如在下载之前我们可以查看用户的网络状态并进行一些UI上面的提示。

B、doInBackground()这个方法实质上就是启动了一个UI线程之外的线程,在里面做一些耗时操作,比如计算或者下载之类的。在此方法中我们可以调用publishProgress()方法来更新进度。

C、onProgressUpdate()这个方法是在UI线程中执行的,我们接收到publishProgress()发送过来的实时进度,我们可以在此对进度条进行实时的更新。

D、onPostExecute()我们在这里拿到了A中方法返回的参数result,并用这个参数来做一些事情。值得注意的是,这个方法是在UI线程中执行的。

二、使用

说了这么多,可能你还是不太明白,当你要使用异步任务AsyncTask,并且创建了他的派生类之后,纵观它的结构,也许会理解的深入一些。我们用一个例子来说明。上代码喽~

public class MainActivity extends ActionBarActivity {
	private Button btn;
	private EditText edt;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edt=(EditText) findViewById(R.id.editText1);
        btn=(Button) findViewById(R.id.button1); 
        btn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// 加载网页的按钮
				connect();
			}
			
		});
        }
    protected void connect() {
	// 为了获取到Activity的上下文对象
    	MyAsyncTask mat=new MyAsyncTask(this);
    	//无启动参数
    	mat.execute();
		
	}
	class MyAsyncTask extends AsyncTask<Void, Integer, String>{
    	final ProgressDialog pd;
    	//声明它 的有参构造器并初始化progressdialog
    	public MyAsyncTask(Context contex){
    		pd=new ProgressDialog(contex);
    		pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    		pd.setTitle("提示:");
    		pd.setButton("cancel", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					// 取消按钮
					pd.cancel();
				}
			});
    		pd.setMax(100);
    		pd.show();
    	}
<span style="white-space:pre">		</span>//下载网页
		@Override
		protected String doInBackground(Void... params) {
			//download page
			StringBuilder sb=null;
			HttpClient client=new DefaultHttpClient();
			HttpGet get=new HttpGet("http://www.apache.org/");
			try {
				HttpResponse res=client.execute(get);	
				HttpEntity he=res.getEntity();
				long contentLength=he.getContentLength();
				
				InputStream is=he.getContent();
				if(is!=null){
					byte[] buffer=new byte[128];
					int len=0;
					sb=new StringBuilder();
					int count=0;
					while(-1!=(len=is.read(buffer))){
						sb.append(new String(buffer,0,len));
						count+=len;
						
						if(contentLength!=0&&contentLength!=-1){
							publishProgress((int)(count*100/contentLength));
						}
					}
					
					//为了进度变化更加明显一些      
					Thread.sleep(100);
				}
				is.close();
					
			} catch (ClientProtocolException e) {
				
				e.printStackTrace();
			} catch (IOException e) {
				
				e.printStackTrace();
			} catch (InterruptedException e) {
				
				e.printStackTrace();
			}finally{
				
			}
			return sb.toString();
		}

		@Override
		protected void onPostExecute(String result) {
			// 将网页内容显示到  EditeText
			super.onPostExecute(result);
			edt.setText(result);
			pd.dismiss();
		}

		@Override
		protected void onPreExecute() {
			// 阿哦~还没写
			super.onPreExecute();
		}

		@Override
		protected void onProgressUpdate(Integer... values) {
			//更新进度条
			super.onProgressUpdate(values);
			pd.setProgress(values[0].intValue());
		}
		
    	
    }
}

这个小Demo是一个AsyncTask的简单应用,功能就是下载网页,运行的效果如图

是不是觉得很简单呢(呵呵!,反正我开始的时候觉得头晕)?还有一些东西需要叨叨一下下。。。

long contentLength=he.getContentLength();

这句代码可能出现返回-1的问题,原因就是和网址指向的网页的头信息有关,有的有这个属性,有的没有,所以如果你用百度网址来弄这个的话,你会悲剧的呦~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值