这次在上一节的基础上,增加一个进度条的更新,下面先上图
跟上一节内容类似,就是遇到一个问题,当进度条没有加载完成的时候按下back返回再进来出现进度条不加载的状况,随后又会继续加载,原因是在于AsyncTask的需要线程执行完毕后才会执行下一个操作,当我们在加载完成前back在加载是加上是需要等待之前的线程工作完毕才会继续下一个线程,在这里我们的处理方法是在onPause方法中加一个判断当前线程是否在工作
protected void onPause() {
super.onPause();
//cancel只是将对应的AsyncTask标记为cancel状态,并未真正取消线程的取消
if (mtask != null && mtask.getStatus() == AsyncTask.Status.RUNNING) {
mtask.cancel(true);
}
}
但是这样操作还没有真正解决问题,原因可以看注释。
因为进度加载时在一个for循环里面的,循环如果没有结束,那么就不会跳出来,所以我们应该对for循环进行判断在i++。
for (int i = 0; i < 100; i++) {
if (isCancelled()) {
break;
}
publishProgress(i);
在onPause中判断了cancel,这里对之前的操作进行判断,如果为iscanceled == true,那么跳出循环。然后相应的onProgressUpdate()方法中也要进行判断
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if (isCancelled()) {
return;
}
//获取进度的更新值
progress.setProgress(values[0]);
}
下面放上全部代码
ProgressBarTest.class:
package com.example.tony.anynctasktest;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ProgressBar;
/**
* Created by Tony on 16/11/15.
*/
public class ProgressBarTest extends Activity {
private ProgressBar progress;
private MyAsyncTask mtask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progressbar);
progress = (ProgressBar) findViewById(R.id.progress);
mtask = new MyAsyncTask();
mtask.execute();//启动
}
@Override
protected void onPause() {
super.onPause();
//cancel只是将对应的AsyncTask标记为cancel状态,并未真正取消线程的取消
if (mtask != null && mtask.getStatus() == AsyncTask.Status.RUNNING) {
mtask.cancel(true);
}
}
class MyAsyncTask extends AsyncTask<Void, Integer, Void> {
@Override
protected Void doInBackground(Void... voids) {
//模拟进度更新
for (int i = 0; i < 100; i++) {
if (isCancelled()) {
break;
}
publishProgress(i);
try {
//增加睡眠时间来延缓更新的进度
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if (isCancelled()) {
return;
}
//获取进度的更新值
progress.setProgress(values[0]);
}
}
}
顺便提一句像我这样的新手们不要忘记注册Activity哟。