Search code examples
javaandroidruntime-errorprogressdialoglooper

Can't create handler inside thread that has not called Looper.prepare() inside AsyncTask for ProgressDialog


I don't understand why I'm getting this error. I'm using AsyncTask to run some processes in the background.

I have:

protected void onPreExecute() 
{
    connectionProgressDialog = new ProgressDialog(SetPreference.this);
    connectionProgressDialog.setCancelable(true);
    connectionProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    connectionProgressDialog.setMessage("Connecting to site...");
    connectionProgressDialog.show();

    downloadSpinnerProgressDialog = new ProgressDialog(SetPreference.this);
    downloadSpinnerProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    downloadSpinnerProgressDialog.setMessage("Downloading wallpaper...");
}

When I get into doInBackground() depending on a condition I:

[...]    
connectionProgressDialog.dismiss();
downloadSpinnerProgressDialog.show();
[...]

Whenever I try downloadSpinnerProgressDialog.show() I receive the error.

Any ideas guys?


Solution

  • The method show() must be called from the User-Interface (UI) thread, while doInBackground() runs on different thread which is the main reason why AsyncTask was designed.

    You have to call show() either in onProgressUpdate() or in onPostExecute().

    For example:

    class ExampleTask extends AsyncTask<String, String, String> {
    
        // Your onPreExecute method.
    
        @Override
        protected String doInBackground(String... params) {
            // Your code.
            if (condition_is_true) {
                this.publishProgress("Show the dialog");
            }
            return "Result";
        }
    
        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            connectionProgressDialog.dismiss();
            downloadSpinnerProgressDialog.show();
        }
    }