页面上现有 ProgressBar 控件 progressBar ,请用书写线程以 10 秒的的时间完成其进度 显示工作。
public class ProgressBarActivity extends Activity { 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); } }
相关代码解释请看代码
布局代码
<?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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/pg"
style="@android:style/Widget.ProgressBar.Horizontal"/>
</RelativeLayout>
Activity代码
public class MainActivity extends AppCompatActivity {
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = (ProgressBar) findViewById(R.id.pg);
ProgressBarThread();
}
private void ProgressBarThread() {
//开启一个线程
Thread td = new Thread(new Runnable() {
@Override
public void run() {
//得到progressBar的MAX长度
int pdMax = progressBar.getMax();
try {
//progressBar没达到最大长度时,进行循环
while (pdMax != progressBar.getProgress()) {
//得到一个每次进行的进度值,因为是要10s完成,所以分为10份
int stepPd = pdMax / 10;
//记录当前进度值
int currentPd = progressBar.getProgress();
//让progressBar进度每次前进最大值的十分之一
progressBar.setProgress(currentPd+stepPd);
//前进一次,睡眠一秒
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
td.start();
}
}