Android中 AsyncTask的使用

来源:互联网 发布:java怎么传值 编辑:程序博客网 时间:2024/05/22 07:58

  在开发过程中经常会用到多线程,开启单独的线程来处理费时的操作,避免阻塞主线程(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任务执行的结果作为此方法的参数返回。


[java] view plaincopy
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">package irdc.liupan.asynctask;  
  2.   
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.InputStream;  
  5.   
  6. import org.apache.http.HttpEntity;  
  7. import org.apache.http.HttpResponse;  
  8. import org.apache.http.HttpStatus;  
  9. import org.apache.http.client.HttpClient;  
  10. import org.apache.http.client.methods.HttpGet;  
  11. import org.apache.http.impl.client.DefaultHttpClient;  
  12.   
  13. import android.app.Activity;  
  14. import android.app.Dialog;  
  15. import android.app.ProgressDialog;  
  16. import android.content.Context;  
  17. import android.content.DialogInterface;  
  18. import android.os.AsyncTask;  
  19. import android.os.Bundle;  
  20. import android.util.Log;  
  21. import android.view.View;  
  22. import android.widget.Button;  
  23. import android.widget.EditText;  
  24. import android.widget.TextView;  
  25.   
  26. public class ASyncTaskTestActivity extends Activity {  
  27.     private Button open;  
  28.     private TextView text;  
  29.     final String TAG = "ASyncTaskTestActivity";  
  30.       
  31.     public class ASyncTaskTest  extends AsyncTask<String, Integer, String>{         
  32.         @Override  
  33. //      后台执行,比较耗时的操作都可以放在这里。  
  34. //      注意这里不能直接操作UI。通常需要较长的时间。在执行过程中可以调用  
  35. //      publishProgress()来更新任务的进度  
  36.         protected String doInBackground(String... params) {  
  37.             // TODO Auto-generated method stub  
  38.              Log.i(TAG, "doInBackground(Params... params) called");    
  39.                 try {    
  40.                     HttpClient client = new DefaultHttpClient();    
  41.                     HttpGet get = new HttpGet(params[0]);    
  42.                     HttpResponse response = client.execute(get);    
  43.                     if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {    
  44.                         HttpEntity entity = response.getEntity();    
  45.                         InputStream is = entity.getContent();    
  46.                         long total = entity.getContentLength();    
  47.                         ByteArrayOutputStream baos = new ByteArrayOutputStream();    
  48.                         byte[] buf = new byte[1024];    
  49.                         int count = 0;    
  50.                         int length = -1;    
  51.                         while ((length = is.read(buf)) != -1) {    
  52.                             baos.write(buf, 0, length);    
  53.                             count += length;    
  54.                             //调用publishProgress公布进度,最后onProgressUpdate方法将被执行    
  55. //                          publishProgress((int) ((count / (float) total) * 100));    
  56.                         }    
  57.                         return new String(baos.toByteArray(), "gb2312");    
  58.                     }    
  59.                 } catch (Exception e) {  
  60.                     Log.e(TAG, e.getMessage());    
  61.                 }    
  62.                 return null;    
  63.         }  
  64.           
  65.         @Override  
  66. //      此方法在主线程执行,任务执行的结果作为此方法的参数被传进来  
  67.         protected void onPostExecute(String result) {  
  68.             // TODO Auto-generated method stub  
  69.             Log.e(TAG, "后台任务执行结束");    
  70.             super.onPostExecute(result);  
  71.             text.setText(result);  
  72.         }  
  73.         @Override  
  74.         protected void onPreExecute() {  
  75.             // TODO Auto-generated method stub  
  76.             super.onPreExecute();  
  77.             text.setText("后台任务开始执行");  
  78.         }  
  79.         @Override  
  80.         protected void onProgressUpdate(Integer... values) {  
  81.             // TODO Auto-generated method stub  
  82.             //本函数当调用publishProgress()时会被调用一般在 在doInBackground函数中调用  
  83.             //但是这里取到的是一个数组,所以要用values[0]来取值,第n个参数就用values[n]来取值    
  84.             super.onProgressUpdate(values);  
  85.         }  
  86.         @Override  
  87.         protected void onCancelled() {  
  88.             // TODO Auto-generated method stub  
  89.             //当调用task.cancel(boolean)会调用本函数  
  90.             super.onCancelled();  
  91.             text.setText("后台任务取消");  
  92.         }  
  93.     }  
  94.     /** Called when the activity is first created. */  
  95.     @Override  
  96.     public void onCreate(Bundle savedInstanceState) {  
  97.         super.onCreate(savedInstanceState);  
  98.         setContentView(R.layout.main);  
  99.         text = (TextView) findViewById(R.id.text);  
  100.         open = (Button) findViewById(R.id.btn);  
  101.         open.setOnClickListener(new View.OnClickListener() {  
  102.               
  103.             @Override  
  104.             public void onClick(View v) {  
  105.                 // TODO Auto-generated method stub  
  106.                 new ASyncTaskTest().execute("http://www.baidu.com");  
  107.   
  108.             }  
  109.         });  
  110.     }  
  111. }</span>  


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


0 0
原创粉丝点击