我正在尝试使用AsyncTask,但活动工作正常,但我遇到了问题。我按下后退按钮后出现问题,因为按下此按钮我的应用程序崩溃了。我看到其他帖子说我必须取消onStop()和onDestroy()中的任务但仍然崩溃。有谁知道如何解决这个问题?
private class MyAsyncTask extends AsyncTask<Void, Integer, Boolean> {
@Override
protected Boolean doInBackground(Void... args0) {
for(int i=1; i<=10; i++) {
try{
if(isCancelled())
break;
publishProgress(i*10);
Thread.sleep(1000);
}catch (InterruptedException e){}
}
return null;
}
/*
* it will update the publishProgress method and it will
* update the interface (if it's necessary)
*/
@Override
protected void onProgressUpdate(Integer... values) {
int progreso = values[0].intValue();
pbarProgreso.setProgress(progreso); // showing progress
pbarProgreso.setSecondaryProgress(progreso + 5);
}
/*
* Initializing progressBar
*/
@Override
protected void onPreExecute() {
pbarProgreso.setMax(100); // maximum value for process bar
pbarProgreso.setProgress(0); // minimum value to start
}
@Override
protected void onPostExecute(Boolean result) {
if(!this.isCancelled())
Toast.makeText(getApplicationContext(), "Task finished!",
Toast.LENGTH_SHORT).show();
}
@Override
protected void onCancelled() {
Toast.makeText(getApplicationContext(), "Task cancelled!",
Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onStop() {
super.onStop();
if(task != null && task.getStatus() == Status.RUNNING){
task.cancel(true);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(task != null && task.getStatus() == Status.RUNNING) {
task.cancel(true);
}
}
答案 0 :(得分:1)
这是因为当您按下后退按钮时,AsyncTask继续工作,当它执行与上下文相关的工作时,该上下文不再存在,并且发生崩溃,最好在活动中使用“isResumed”布尔指示符变量,并在onPause中将其设置为false,并在onResume中设置为true,并在asyncTask内部执行与上下文相关的事务,在if条件中。 或者,如果此代码位于片段内,则可以使用isAdded()方法来检查片段是否处于活动状态。取消也很重要,但在Activity暂停和AsyncTask取消之间可能会有延迟,因此保持该变量很重要。