参考此blog写的非常的好 http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html
MainActivity.java
1 import android.support.v7.app.AppCompatActivity; 2 import android.os.Bundle; 3 import android.view.View; 4 import android.widget.Button; 5 import android.widget.ProgressBar; 6 import android.widget.TextView; 7 8 public class MainActivity extends AppCompatActivity { 9 10 @Override11 protected void onCreate(Bundle savedInstanceState) {12 super.onCreate(savedInstanceState);13 setContentView(R.layout.activity_main);14 15 Button button = (Button)findViewById(R.id.button_downLoad);16 final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar);17 final TextView textView = (TextView) findViewById(R.id.textView_hello);18 final ProgressBar progressBar2 = (ProgressBar)findViewById(R.id.progressBar2);19 20 button.setOnClickListener(new View.OnClickListener() {21 @Override22 public void onClick(View v) {23 ProgressBarAsyncTask asyncTask = new ProgressBarAsyncTask(textView, progressBar, progressBar2);//传进去需要改变的控件24 asyncTask.execute(55);//传入初始参数(这里表示将从55开始计数)25 }26 });27 28 }29 }
activity_main.xml
ProgressBarAsyncTask.java
1 package com.turtle920.tread; 2 3 import android.os.AsyncTask; 4 import android.widget.ProgressBar; 5 import android.widget.TextView; 6 7 public class ProgressBarAsyncTask extends AsyncTask{ 8 /*Params 启动任务执行的输入参数,比如HTTP请求的URL。由主线程中的asyncTask.execute(55);传入 9 Progress 后台任务执行的百分比。10 Result 后台执行任务最终返回的结果,比如String。*/11 private TextView textView;12 private ProgressBar progressBar;13 private ProgressBar progressBar2;14 15 16 public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar, ProgressBar progressBar2) {17 super();18 this.textView = textView;19 this.progressBar = progressBar;20 this.progressBar2 = progressBar2;21 }22 23 /**24 * 这里的Integer参数对应AsyncTask中的第一个参数25 * 这里的String返回值对应AsyncTask的第三个参数26 * 该方法并不运行在UI线程当中,主要用于异步操作,所有在该方法中不能对UI当中的空间进行设置和修改27 * 但是可以调用publishProgress方法触发onProgressUpdate对UI进行操作28 */29 @Override30 protected String doInBackground(Integer... params) { //...表示可以传若干参数31 NetOperator netOperator = new NetOperator();32 int i = params[0];//由主线程中的asyncTask.execute(55);传入33 for (i = params[0]; i <= 100; i+=1) {34 netOperator.operator();35 publishProgress(i, 100-i);//传两个参数给onProgressUpdate36 }37 return "" + i + " " + params[0].intValue() + "****";//传参数给onPostExecute38 }39 40 /**41 *该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置42 */43 @Override44 protected void onPreExecute() {45 textView.setText("开始执行异步线程");46 }47 48 /**49 * 这里的Intege参数对应AsyncTask中的第二个参数50 * 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行51 * onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作52 */53 @Override54 protected void onProgressUpdate(Integer... values) { //参数来自publishProgress()55 int value = values[0];56 int value1 = values[1];57 progressBar.setProgress(value);58 progressBar2.setProgress(value1);59 textView.setText(""+value+"% "+value1);60 }61 62 /**63 * 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)64 * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置65 */66 @Override67 protected void onPostExecute(String result) { //参数来自doInBackground() return68 textView.setText("异步操作执行结束" + result);69 }70 71 72 }
NetOperator.java
1 package com.turtle920.tread; 2 3 //模拟网络环境 4 public class NetOperator { 5 6 public void operator(){ 7 try { 8 //休眠 9 Thread.sleep(10);10 } catch (InterruptedException e) {11 // TODO Auto-generated catch block12 e.printStackTrace();13 }14 }15 16 }