ANDROID-----------------AsyncTask使用实例

 【Android】学习笔记(13)——AsyncTask使用实例
2011-09-05 21:00:28
ZHUAZI :   http://theron.blog.51cto.com/2383825/658455
AsyncTask 是Android为我们提供的另一种简单的异步线程机制。它可以比较方便的让我们的UI线程和后台线程并发,可以让用户执行一些需要长时间等待的程序时,用户体验不会因此而下降。
 
首先AsyncTask是一个抽象类,我们要使用它,必须写一个类来继承它。它有三个泛型参数,Param,Progress,Result,分别表示任务执行的参数,后台程序执行的进度和后台程序执行的结果。如果不提供参数,或者不使用进度,或者不需要结果,可以传入Void。同时,父类AsyncTask定义了若干方法,其中doInBackground=\'#\'" /div>
 
另外还有3个方法,分别是:
onPreExecute(),这个方法归属于UI线程,它执行于DoInBackgroud()之前,可以用作一些预处理,等会儿在例子中,我们使用这个方法来预处理进度条和百分比的显示初始化。
 
onPostExecute(Result),这个方法也归属于UI线程,他执行于doInBackgroud()之后,用于传递这个后台任务的执行结果。
 
onProgressUpdate(Progress...),这个方法同样归属于UI线程,它的执行与否,取决于DoInBackgroud()方法中是否使用了publishProgress方法,每次执行publishProgress方法,onProgressUpdate(Progress...)就会被调用一次。在这个方法中,通过publishProgress方法传来的进度信息,来更新UI信息。
 
需要注意的是,AsyncTask的子类的一个实例的生命周期从onPreExecute()开始,到onPostExecute(Result)结束,该实例之后就变成了垃圾,没用了。如果需要使用,就必须重新创建一个实例。
 
下面来看一个例子,这个例子实现的是一个进度条,从点击”Start”按钮开始进度条滚动。
 
布局文件很简单,一个开始按钮,一个进度条,和一个显示进度百分比的TextView
布局文件如下:
   
   
  1. <?xml version="1.0" encoding="utf-8"?> 
  2.  
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  4.     android:orientation="vertical" android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent"> 
  6.     <Button 
  7.        android:id="@+id/start" 
  8.        android:layout_width="fill_parent" 
  9.        android:layout_height="wrap_content" 
  10.        android:text="Start" 
  11.     /> 
  12.     
  13.     <ProgressBar 
  14.        android:id="@+id/bar" 
  15.        android:layout_width="200dp" 
  16.        android:layout_height="wrap_content" 
  17.        style="?android:attr/progressBarStyleHorizontal" 
  18.        android:max="100" 
  19.        android:visibility="gone" 
  20.     /> 
  21.     <TextView 
  22.        android:id="@+id/percent" 
  23.        android:layout_width="wrap_content" 
  24.        android:layout_height="wrap_content" 
  25.        android:textSize="10dp" 
  26.        android:text="0%" 
  27.        android:visibility="gone" 
  28.        android:layout_marginLeft="90dp" 
  29.        android:layout_marginTop="-18dp" 
  30.        android:textColor="#000" 
  31.     /> 
  32. </LinearLayout> 
 
接下来看Java代码:
 
   
   
  1. import android.app.Activity; 
  2. import android.os.AsyncTask; 
  3. import android.os.Bundle; 
  4. import android.view.View; 
  5. import android.view.View.OnClickListener; 
  6. import android.widget.Button; 
  7. import android.widget.ProgressBar; 
  8. import android.widget.TextView; 
  9.   
  10. public class AsyncTaskDemoActivity extends Activity { 
  11.        private ProgressBar bar = null
  12.        private Button start = null 
  13.        private TextView percent = null 
  14.     /** Called when the activity is first created. */ 
  15.  
  16.     @Override 
  17.     public void onCreate(Bundle savedInstanceState) { 
  18.  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);  
  21.         
  22.         start = (Button)findViewById(R.id.start); //Start按钮 
  23.         
  24.         start.setOnClickListener(new OnClickListener() { 
  25.  
  26.                      @Override 
  27.                      public void onClick(View arg0) { 
  28.                             // TODO Auto-generated method stub  
  29.                             SubAsyncTask sat = new SubAsyncTask(); //创建AsyncTask子类的实例 
  30.                             sat.execute(); //启动线程
  31.                      } 
  32.               });         
  33.     } 
  34.     
  35.     public class SubAsyncTask extends AsyncTask<Object, Integer, String>{ 
  36.  
  37.   
  38.     @Override 
  39.     protected void onPreExecute() { 
  40.             // TODO Auto-generated method stub 
  41.             System.out.println("Thread in onPreExecute---->"+Thread.currentThread().getName()); 
  42.   //在预处理方法中定义进度条和百分比文本
  43.             bar = (ProgressBar)findViewById(R.id.bar); 
  44.             bar.setVisibility(View.VISIBLE);
  45.  
  46.             percent = (TextView)findViewById(R.id.percent);  
  47.             percent.setVisibility(View.VISIBLE); 
  48.             super.onPreExecute(); 
  49.     } 
  50.     
  51.     @Override 
  52.     protected String doInBackground(Object... arg0) { 
  53.  
  54.             // TODO Auto-generated method stub 
  55.             //每50ms执行一次publishProgress
  56.             for (int j = 0; j <=100; j+=10) { 
  57.                    System.out.println("Thread in doInBackground---->"+Thread.currentThread().getName()); 
  58.  
  59.                    publishProgress(j); 
  60.                    try { 
  61.                           Thread.sleep(50); 
  62.                    } catch (InterruptedException e) { 
  63.  
  64.                           // TODO Auto-generated catch block 
  65.  
  66.                           e.printStackTrace(); 
  67.                    } 
  68.             } 
  69.             return null
  70.     } 
  71.     
  72.     @Override 
  73.     protected void onProgressUpdate(Integer... values) { 
  74.  
  75.             // TODO Auto-generated method stub 
  76. //每执行一次publishProgress就需要执行一次这个函数,在这个函数里变化进度条信息
  77.             System.out.println("Thread in onProgressUpdate---->"+Thread.currentThread().getName()); 
  78.  
  79.             bar.setProgress(values[0]); 
  80.             percent.setText(values[0]+"%"); 
  81.     } 
  82.     
  83.     @Override 
  84.     protected void onPostExecute(String result) { 
  85.             // TODO Auto-generated method stub 
  86. //doInBackground方法执行完后,执行这个函数,用来提交结果
  87.             bar.setVisibility(View.GONE); 
  88.             percent.setVisibility(View.GONE); 
  89.             System.out.println("Thread in onPostExecute---->"+Thread.currentThread().getName()); 
  90.  
  91.             super.onPostExecute(result); 
  92.     } 
  93.     } 
从代码看出,我们并没有将 UI上得进度条控件和文本控件在onCreate函数中创建,而是只创建了一个开始Button,然后用匿名内部类为该Button绑定了一个事件监听器。在监听器内部,我们实例化了SubAsyncTask,SubAsyncTask是AsyncTask的子类,然后调用execute()方法来启动它。
 
重要的我们看 SubAsyncTask子类的实现。它继承了AsyncTask类并且重载了四个方法,也就是上面我提到的那四个方法。窝在每个方法内都设置了输出语句,查看当前的方法是哪个线程在执行。
作为预处理方法,我在 onPreExecute()方法中定义了进度条和百分比的TextView。当该函数执行完毕后,就开始执行doInBackground方法,在此方法中,我每隔50ms就执行一次publishProgress方法,这就意味着相应的,会有一个onProgressUpdate方法被调用,在onProgressUpdate方法中,我对进度条和进度百分比进行改变设置。当doInBackground方法运行完毕后,会自动执行onPostExecute方法,来提交执行的结果。
下图为运行的效果图:

 
下图是每隔 50ms,在Logcat中打印出来的记录,可以看出有两个线程在运行,一个是主线程,也就是UI线程,另一个是AsyncTask的线程。再看他们的输出顺序,可以发现,在更新进度条阶段,并不是规律的主线程与AsyncTask线程交替出现,也就说明,当AsyncTask线程更新进度条信息后,并没有等待UI线程更新UI,而是继续往下执行了,这也进一步体现了异步的特点。
 

如果将时间间隔改的更小,这种异步的输出就更明显了,下图是将时间间隔改为 10ms的Logcat输出。

 
AsyncTask比较方便的为我们提供了异步机制,可以有效的处理一些简单的 UI线程与后台线程的异步实现和交互。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值