KillerPunk
KillerPunk

Reputation: 123

Application crashes when I press back button using AsyncTask

I am trying to use AsyncTask and the activity is working perfectly but I am facing a problem. The problem comes after I have pressed back button, because pressing this button my app crashes. I have seen other posts saying that I must cancel the task in onStop() and onDestroy() but still crashes. Does anyone have any idea how can I solve that?

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

Upvotes: 1

Views: 263

Answers (1)

mes
mes

Reputation: 3621

It's because when you press back button, AsyncTask continues to work, and when it do context related work, that context no longer exists, and a crash happens, it's better to use a "isResumed" boolean indicator variable inside an activity, and set it to false in onPause and set to true inside onResume, and inside an AsyncTask do context related things, inside an if condition. Or if this code is inside a fragment, can use isAdded() method, to check if fragment is active or not. Cancel is also important, but there may be a delay, between an Activity pause and AsyncTask cancel, so keeping that variable is important.

Upvotes: 1

Related Questions