Gabriela Radu
Gabriela Radu

Reputation: 767

ProgressDialog.dismiss() does not close in Async Class android

I have an inner class that downloads some images from the server. The problem is that the ProgressDialog does not dismiss() onPostExecute() method and don't understand why. I understand that the progress dialog should be shown onPreExecute() method, and the after the code from the doInBackground() finished , in the onPostExecute() method the dialog should be dismiss. Do you have any idea what i am doing wrong here? Thank you.

 /**
 * Download images from server
 */
public class DownloadAsyncTask extends AsyncTask<Void, Integer, Void> {
    private ProgressDialog mDialog;

    // execution of result of Long time consuming operation
    protected void onPostExecute(Void result) {

        // progressDialog.show();
        if (mDialog.isShowing()) {
            mDialog.dismiss();
        }


    }

    // Things to be done before execution of long running operation.
    protected void onPreExecute() {
        mDialog = ProgressDialog
                .show(ImagesActivity.this, getString(R.string.pleasewait),
                        getString(R.string.loading));
    }

    // perform long running operation operation
    protected Void doInBackground(Void... params) {
        System.out.println("doInBackground loading.." + id);
        String tempPath = FileUtils.createTempFile(id);
        for (int i = 0; i < imagePaths.size(); i++) {
            imagePaths.get(i).trim();
            try {
                Bitmap imgTemp;
                imgTemp = FileUtils.downloadBitmapFromURL(id,
                        imagePaths.get(i), tempPath);
                System.out.println("imgTemp: " + imgTemp);
                if (imgTemp != null) {
                    // save image on sdcard.
                    // compress it for performance
                    Bitmap img = Bitmap.createScaledBitmap(imgTemp, 90, 80,
                            true);
                    imgTemp.recycle();
                    FileUtils.saveDataToFile(img, tempPath,
                            imagePaths.get(i));
                } else {
                    continue;
                }
            } catch (IOException e) {
                e.printStackTrace();
                mDialog.dismiss();
            }
        }

        Looper.prepare();
        mDialog.dismiss();
        return null;
    }

    /*
     * Things to be done while execution of long running operation is in
     * progress. 
     */
    protected void onProgressUpdate(Integer... values) {
        if (mDialog.isShowing()) {
            mDialog.dismiss();
        }
    }
}

Upvotes: 2

Views: 5885

Answers (4)

confucius
confucius

Reputation: 13327

actually what you are trying to do is to access the UI Thread from another thread and that is not possible , in your case you are using AsyncTask class enables proper and easy use of the UI thread without having to manipulate threads and/or handlers. use onPostExecute(Result) to access the UI Thread.

so this should work

protected void onPostExecute(Void result) {

     progressDialog.show();
    if (mDialog.isShowing()) {
        mDialog.dismiss();
    }
}

Upvotes: 1

Zedzdead
Zedzdead

Reputation: 354

I've struggled with this same problem for quite a while. Here is how I got it solved, take a look at this part of the documentation:

A dialog is always created and displayed as a part of an Activity. You should normally create dialogs from within your Activity's onCreateDialog(int) callback method. When you use this callback, the Android system automatically manages the state of each dialog and hooks them to the Activity, effectively making it the "owner" of each dialog

Note: If you decide to create a dialog outside of the onCreateDialog() method, it will not be attached to an Activity. You can, however, attach it to an Activity with setOwnerActivity(Activity).

from: http://developer.android.com/guide/topics/ui/dialogs.html#ShowingADialog

This is an example of what you have to set on your activity:

  @Override
  protected void onPrepareDialog(int id, Dialog dialog)
  {
    //This doesn't do anything
    if (id == DIALOG_PROGRESS_ID) {
      ((ProgressDialog)dialog).setIndeterminate(true);
    }

    super.onPrepareDialog(id, dialog);
  }

  @Override
  protected Dialog onCreateDialog(int id)
  {
    if (id == DIALOG_PROGRESS_ID) {
      ProgressDialog dialog = new ProgressDialog(this);
      dialog.setMessage("Loading");
      dialog.setCancelable(false);
      dialog.setIndeterminate(true);
      return dialog;
    }
    return null;
  }

You can then call myActivity.showDialog(myActivity.DIALOG_PROGRESS_ID), myActivity.dismissDialog(myActivity.DIALOG_PROGRESS_ID) from any where as long as you have a reference to your activity instance.

Upvotes: 1

Arun Kumar
Arun Kumar

Reputation: 2934

Your code is working fine but can you check that control are reaching in Post onPostExecute() method I have tried as

    package com.alarm.activity;

    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.os.AsyncTask;
    import android.os.Bundle;

    public class AlarmManagerActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //set up main content view
            setContentView(R.layout.main);

            new DownloadAsyncTask().execute();
        }

        /**
         * Download images from server
         */
        public class DownloadAsyncTask extends AsyncTask<Void, Integer, Void> {
            private ProgressDialog mDialog;

            // execution of result of Long time consuming operation
            @Override
            protected void onPostExecute(Void result) {

                // progressDialog.show();
                if (mDialog.isShowing()) {
                    mDialog.dismiss();
                }

            }

            // Things to be done before execution of long running operation.
            @Override
            protected void onPreExecute() {
                mDialog = ProgressDialog.show(AlarmManagerActivity.this, "Hello", "Test");
            }

            // perform long running operation operation
            @Override
            protected Void doInBackground(Void... params) {
                //System.out.println("doInBackground loading.." + id);
                /*            String tempPath = FileUtils.createTempFile(id);
                            for (int i = 0; i < imagePaths.size(); i++) {
                                imagePaths.get(i).trim();
                                try {
                                    Bitmap imgTemp;
                                    imgTemp = FileUtils.downloadBitmapFromURL(id, imagePaths.get(i), tempPath);
                                    System.out.println("imgTemp: " + imgTemp);
                                    if (imgTemp != null) {
                                        // save image on sdcard.
                                        // compress it for performance
                                        Bitmap img = Bitmap.createScaledBitmap(imgTemp, 90, 80, true);
                                        imgTemp.recycle();
                                        FileUtils.saveDataToFile(img, tempPath, imagePaths.get(i));
                                    }
                                    else {
                                        continue;
                                    }
                                }
                                catch (IOException e) {
                                    e.printStackTrace();
                                    mDialog.dismiss();
                                }
                            }

                            Looper.prepare();
                            mDialog.dismiss();*/

                try {
                    Thread.sleep(5000);
                }
                catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }

            /*
             * Things to be done while execution of long running operation is in
             * progress. 
             */
            @Override
            protected void onProgressUpdate(Integer... values) {
                if (mDialog.isShowing()) {
                    mDialog.dismiss();
                }
            }
        }
    }

I think problem in doInbackground() method. I have simply run thread for sleep 5 sec and after control reaches in post() method and dissmiss progress dialog.

Upvotes: 0

Walid Hossain
Walid Hossain

Reputation: 2714

Use a handler and onPostExecute() send the handler msg to dismiss the progress dialog. You can get help from this link ProgressDialog dismissal in android

Upvotes: 0

Related Questions