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]); } }