Android中 AsyncTask的使用

     在开发过程中经常会用到多线程,开启单独的线程来处理费时的操作,避免阻塞主线程(UI线程)。在子线程中通过Handler类,采用消息机制来更新主线程,和主UI线程进行通信。但是太多的子线程会给系统带来巨大的负担,随之带来一些性能问题。所以出现了AsyncTask。


     Android中的AsyncTask类其实就是一个执行大开销的辅助类。其基本思路是:发起一个异步任务,在子线程中进行执行。当任务线程执行过程中,显示一个进度框,可以根据任务的执行情况发出进度来更新UI线程中的进度框,当任务将结果返回到主线程中,此时将进度框关闭。


      AsyncTask底层是一个线程池,所以在处理异步任务的数据量特别大的时候,就显得很有优势。


下面介绍AsyncTask类

AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。

Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果


方法:

1.   doInBackground(params…)在后台线程执行,完成任务,这里不能直接操作主线程,通常需要较长的时间。在执行过程中可以调用publishProgress来更新任务的进度。
2.   onPostExecute(result)     此方法在主线程执行,任务执行的结果作为此方法的参数返回。
3.
  onProgressUpdate(Integer... values) 当调用publishProgress()时会被调用,用来显示进度,增加用户体验
4.
  onPreExecute()  调用excute()函数后,任务执行之前调用此方法,可以在该方法中做一些准备工作,如在界面 上显示一个进度条,或者一些控件的实例化.
5.
  onCancelled(),在用户取消线程操作的时候调用。在主线程中调用cancle(boolean)的时候调用。


需要注意的地方

1. AsyncTask的实例必须在UIthread中创建.

2. AsyncTask的Execute方法必须在UIthread中调用.

3. 不要手动的调用onPreExecute(),onPostExecute(result) doInBackground(params…),onProgressUpdate(params…)等方法.

4. 该AsyncTask只能被执行一次,否则多次调用时将会出现异常.



整个流程:

       AsyncTask的整个调用过程都是从execute方法开始的(主线程中调用),一旦在主线程中调用execute方法,就会调用onPreExecute方法,在这里可以做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化.同样也可以通过onProgressUpdate方法给用户一个进度条的显示更新,增加用户体验;最后通过onPostExecute方法,将在doInBackground得到的结果来处理操作UI。doInBackground任务执行的结果作为此方法的参数返回。


package irdc.liupan.asynctask;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class ASyncTaskTestActivity extends Activity {
    private Button open;
    private TextView text;
    final String TAG = "ASyncTaskTestActivity";
    
	public class ASyncTaskTest  extends AsyncTask<String, Integer, String>{		
		@Override
//		后台执行,比较耗时的操作都可以放在这里。
//		注意这里不能直接操作UI。通常需要较长的时间。在执行过程中可以调用
//		publishProgress()来更新任务的进度
		protected String doInBackground(String... params) {
			// TODO Auto-generated method stub
			 Log.i(TAG, "doInBackground(Params... params) called");  
	            try {  
	                HttpClient client = new DefaultHttpClient();  
	                HttpGet get = new HttpGet(params[0]);  
	                HttpResponse response = client.execute(get);  
	                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
	                    HttpEntity entity = response.getEntity();  
	                    InputStream is = entity.getContent();  
	                    long total = entity.getContentLength();  
	                    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
	                    byte[] buf = new byte[1024];  
	                    int count = 0;  
	                    int length = -1;  
	                    while ((length = is.read(buf)) != -1) {  
	                        baos.write(buf, 0, length);  
	                        count += length;  
	                        //调用publishProgress公布进度,最后onProgressUpdate方法将被执行  
//	                        publishProgress((int) ((count / (float) total) * 100));  
	                    }  
	                    return new String(baos.toByteArray(), "gb2312");  
	                }  
	            } catch (Exception e) {
	                Log.e(TAG, e.getMessage());  
	            }  
	            return null;  
		}
		
		@Override
//		此方法在主线程执行,任务执行的结果作为此方法的参数被传进来
		protected void onPostExecute(String result) {
			// TODO Auto-generated method stub
			Log.e(TAG, "后台任务执行结束");  
			super.onPostExecute(result);
			text.setText(result);
		}
		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
			text.setText("后台任务开始执行");
		}
		@Override
		protected void onProgressUpdate(Integer... values) {
			// TODO Auto-generated method stub
			//本函数当调用publishProgress()时会被调用一般在 在doInBackground函数中调用
            //但是这里取到的是一个数组,所以要用values[0]来取值,第n个参数就用values[n]来取值  
			super.onProgressUpdate(values);
		}
		@Override
		protected void onCancelled() {
			// TODO Auto-generated method stub
			//当调用task.cancel(boolean)会调用本函数
			super.onCancelled();
			text.setText("后台任务取消");
		}
	}
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        text = (TextView) findViewById(R.id.text);
        open = (Button) findViewById(R.id.btn);
        open.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				new ASyncTaskTest().execute("http://www.baidu.com");

			}
		});
    }
}


参考 :http://blog.sina.com.cn/s/blog_80d7cd91010168x0.html


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值