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中使用Asynctask更新UI(如进度条)时遇到的同步问题及解决方法。当任务未完成而Activity被暂停时,再次启动Activity会导致进度不同步。文章提供了一个示例Activity和Asynctask实现,展示了如何通过取消当前运行的任务并确保其生命周期与Activity保持一致来解决该问题。
6266

被折叠的 条评论
为什么被折叠?



