参考此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 @Override 11 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 @Override 22 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
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:orientation="vertical" android:gravity="center_horizontal" tools:context=".MainActivity"> <TextView android:text="Hello World!" android:id="@+id/textView_hello" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ProgressBar style="?android:attr/progressBarStyleHorizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/progressBar" android:layout_gravity="center_horizontal" /> <ProgressBar style="?android:attr/progressBarStyleHorizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/progressBar2" android:progress="100" android:layout_gravity="center_horizontal" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Download" android:id="@+id/button_downLoad" android:layout_gravity="center_horizontal" /> </LinearLayout>
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<Integer, Integer, String> { 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 @Override 30 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);//传两个参数给onProgressUpdate 36 } 37 return "" + i + " " + params[0].intValue() + "****";//传参数给onPostExecute 38 } 39 40 /** 41 *该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置 42 */ 43 @Override 44 protected void onPreExecute() { 45 textView.setText("开始执行异步线程"); 46 } 47 48 /** 49 * 这里的Intege参数对应AsyncTask中的第二个参数 50 * 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行 51 * onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作 52 */ 53 @Override 54 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 @Override 67 protected void onPostExecute(String result) {//参数来自doInBackground() return 68 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 block 12 e.printStackTrace(); 13 } 14 } 15 16 }