当我使用AsyncTask按下后退按钮时,应用程序崩溃

时间:2015-02-19 13:33:46

标签: android-asynctask

我正在尝试使用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);
        }  
}

1 个答案:

答案 0 :(得分:1)

这是因为当您按下后退按钮时,AsyncTask继续工作,当它执行与上下文相关的工作时,该上下文不再存在,并且发生崩溃,最好在活动中使用“isResumed”布尔指示符变量,并在onPause中将其设置为false,并在onResume中设置为true,并在asyncTask内部执行与上下文相关的事务,在if条件中。 或者,如果此代码位于片段内,则可以使用isAdded()方法来检查片段是否处于活动状态。取消也很重要,但在Activity暂停和AsyncTask取消之间可能会有延迟,因此保持该变量很重要。