1: 通过AsyncTask实现 import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ProgressBar; public class ProgressBarActivity extends AppCompatActivity { private ProgressBar progressBar; private MyTask myTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_progressbar); progressBar = (ProgressBar) findViewById(R.id.progress); myTask = new MyTask(); myTask.execute(); } /** * 底层是使用线程池完成的,而且使用了线程安全。 */ class MyTask extends AsyncTask<Void, Integer, Void> { int max = progressBar.getMax(); int one = max / 10; @Override protected Void doInBackground(Void... voids) { for (int i = 0; i < 10; i++) { if (isCancelled()) { /** 如果取消了 直接使用break跳出循环 */break; } publishProgress(one); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); if (isCancelled()) { /** 如果取消了 直接使用return返回 */ return; } /** 记录当前progressbar的进度值 */ int current = progressBar.getProgress(); progressBar.setProgress(current + values[0]); } } @Override protected void onPause() { super.onPause(); /** 将 AsyncTask 的生命周期与Activity进行绑定 */ if (myTask != null && myTask.getStatus() == AsyncTask.Status.RUNNING) { /** 此时只是将对应的 AsyncTask 标记为取消状态 */ myTask.cancel(true); } } @Override protected void onDestroy() { super.onDestroy(); progressBar.setProgress(0); } }
2: 通过Thread实现
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ProgressBar;
/**
* 页面上现有ProgressBar控件progressBar,请用书写线程以10秒的的时间完成其进度显示工作。
*/
public class MainActivity extends AppCompatActivity {
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
progressBarChange();
}
/**
* progressBar改变
*/
private void progressBarChange() {
//开启一个线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//得到progeressBar的最大长度
int progressBarMax = progressBar.getMax();
try {
//progressBar当前的长度没有达到他的最长度,让循环一直进行
while (progressBarMax != progressBar.getProgress()) {
//拿到一个每次前进的进度值,因为是要10s完成,所以分为10份
int stepProgress = progressBarMax / 10;
//progressBar当前的进度值
int currentProgress = progressBar.getProgress();
//让progressBar进度为每次前进最大值的十分之一
progressBar.setProgress(currentProgress + stepProgress);
//前进一次,睡眠一秒
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
//开启线程
thread.start();
}
/**
* 初始View
*/
private void initView() {
progressBar = (ProgressBar) findViewById(R.id.progressbar);
}
}
3: 布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context="com.duanlian.progressbardemo.MainActivity">
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:id="@+id/progressbar"
android:layout_centerInParent="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</RelativeLayout>