一、简介
二、代码
1.xml
(1)activity_main.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 > 7 <TextView 8 android:id="@+id/textViewId" 9 android:layout_width="fill_parent" 10 android:layout_height="wrap_content" 11 android:text="AsyncTask" 12 /> 13 14 <ProgressBar 15 android:id="@+id/progerssBarId" 16 android:layout_width="fill_parent" 17 android:layout_height="wrap_content" 18 style="@android:style/Widget.ProgressBar.Horizontal" 19 android:max="100"/> 20 <Button 21 android:id="@+id/buttonId" 22 android:layout_width="fill_parent" 23 android:layout_height="wrap_content" 24 android:text="开始异步操作" 25 /> 26 <Button 27 android:id="@+id/printButtonId" 28 android:layout_width="fill_parent" 29 android:layout_height="wrap_content" 30 android:text="打印字符串" 31 /> 32 </LinearLayout>
2.java
(1)MainActivity.java
1 package com.async; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.view.View.OnClickListener; 7 import android.widget.Button; 8 import android.widget.ProgressBar; 9 import android.widget.TextView; 10 11 public class MainActivity extends Activity { 12 13 private Button button = null; 14 private Button printButton = null; 15 private ProgressBar progressBar = null; 16 private TextView textView = null; 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 23 button = (Button)findViewById(R.id.buttonId); 24 printButton = (Button)findViewById(R.id.printButtonId); 25 progressBar = (ProgressBar)findViewById(R.id.progerssBarId); 26 textView = (TextView)findViewById(R.id.textViewId); 27 28 button.setOnClickListener(new OnClickListener() { 29 @Override 30 public void onClick(View v) { 31 ProgressBarAsyncTask progressBarAsyncTask = new ProgressBarAsyncTask(textView, progressBar); 32 //调用AsyncTask的excuet方法会在新线程中执行 33 progressBarAsyncTask.execute(1000);//参数用来给onPostExecute作测试用 34 } 35 }); 36 37 printButton.setOnClickListener(new OnClickListener() { 38 @Override 39 public void onClick(View v) { 40 System.out.println("printButton------->"); 41 } 42 }); 43 } 44 }
(2)ProgressBarAsyncTask.java
1 package com.async; 2 3 import android.os.AsyncTask; 4 import android.widget.ProgressBar; 5 import android.widget.TextView; 6 7 //生成该类的对象,并调用其execute方法之后 8 //首先执行的的onPreExecute方法 9 //其次是执行doInBackground方法 10 //AsyncTask<Integer, Integer, String>三个泛形参数的作用为 11 //(1)Integer:指定doInBackground()的参数类型为Integer 12 //(2)Integer:指定onProgressUpdate()的参数类型为Integer 13 //(3)String:指定doInBackground()的返回类型及onPostExecute()的参数类型为String 14 public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> { 15 16 private TextView textView = null; 17 private ProgressBar progressBar = null; 18 19 public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) { 20 super(); 21 this.textView = textView; 22 this.progressBar = progressBar; 23 } 24 25 //该方法并不运行在UI线程当中,所以在该方法当中,不能对UI当中的控件进行设置和修改 26 //主要用于进行异步操作。 27 @Override 28 protected String doInBackground(Integer... params) { 29 NetOperator netOperator = new NetOperator(); 30 int i = 0; 31 for(i = 10 ; i <= 100 ; i+=10) { 32 netOperator.operate(); 33 //用于发布更新消息 34 publishProgress(i); 35 } 36 return i + params[0].intValue() + ""; 37 } 38 39 //该方法运行在UI线程当中,主要用于进行异步操作之前的UI准备工作 40 @Override 41 protected void onPreExecute() { 42 textView.setText("开始执行异步操作"); 43 } 44 45 //在doInBackground方法执行结束之后再运行,并且运行在UI线程当中。 46 //主要用于将异步任务执行的结果展示给客户 47 @Override 48 protected void onPostExecute(String result) { 49 textView.setText("异步操作执行结束" + result); 50 } 51 52 //在doInBackground方法当中,每次调用publishProgress()方法之后,都会触发该方法 53 //用于在异步任务执行的过程当中,对用户进行提示,例如控制进度条等 54 @Override 55 protected void onProgressUpdate(Integer... values) { 56 int value = values[0]; 57 progressBar.setProgress(value); 58 } 59 60 61 }
(3)NetOperator.java
1 package com.async; 2 3 //模拟网络操作 4 public class NetOperator { 5 6 public void operate() { 7 try { 8 Thread.sleep(1000); 9 } catch (InterruptedException e) { 10 e.printStackTrace(); 11 } 12 } 13 }