您的位置:首页 > 移动开发 > Android开发

Android_NewBird之Asynctask的基本使用(2)

2016-07-27 16:42 453 查看
Asynctask线程进度条退出之后取消,再进入界面,发现进度条不同步。

原因是:Asynctask必须先将之前的线程结束掉,才会执行下一个线程。

解决方案:将Asynctask的生命周期与Activity设置成一致。

public class AsynctaskLoadProgressTest extends Activity {

private ProgressBar pg;
private MyAsynctask myAsynctask;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_asynctask_load_progress_test);
pg = (ProgressBar) findViewById(R.id.pg);
myAsynctask = new MyAsynctask();
myAsynctask.execute();
}

//进入task之后再退出,发现task不再同步。  原因:需要将上一次的task线程执行完。即将for循环执行完毕
//解决方法:让Asynctask与Activity具备相同的生命周期
@Override
protected void onPause() {
super.onPause();
//Asynctask不为空且处于running状态
if(myAsynctask != null && myAsynctask.getStatus() == AsyncTask.Status.RUNNING){
myAsynctask.cancel(true); //并不会直接取消掉task,而是发送一个cancel请求,并不会直接停止一个线程
}
}

class MyAsynctask extends AsyncTask<Void,Integer,Void>{

@Override
protected Void doInBackground(Void... voids) {
for(int i=0; i<100; i++){
//进行cancel判断
if(isCancelled()){
break;
}
publishProgress(i);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}

@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if(isCancelled()){
return;
}
pg.setProgress(values[0]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android